はじめに
セキュリティコマンドは、有用な作業が止まった後も動き続けることがあります。何かを停止する前に、正しいプロセスを特定し、他にどの処理を維持すべきか理解する必要があります。
この実習では、無害な演習用ワーカーとアプリケーションログを提供します。プラットフォームのサービスに触れずに、プロセス情報を調べ、ターミナルのジョブを管理し、選択したワーカーを一つ停止して、診断情報を抽出します。
プロセスを調べ、ターミナルのジョブを管理する
このステップでは、実行中のプロセスを調べ、ターミナルのフォアグラウンドとバックグラウンドの作業を比較します。
Kali に入り、共有ワークスペースを選びます。
kali
cd /home/labex/project
プロセスは、プロセス ID(PID)と所有者を持つ実行中のプログラムです。ps はスナップショットを表示します。-e はすべてのプロセスを選び、-o は表示するフィールドを選びます。
ps -eo pid,user,args
準備済みの Python 演習ワーカーと、その所有者 kali を探してください。無関係なプラットフォームやコンテナのプロセスは無視します。
top は通常、継続的に表示を更新します。-b は印刷可能なバッチ表示を選び、-n 1 は更新を一度に限定します。
top -b -n 1
対話型表示にとどまらず、リソースのスナップショットを表示します。PID やリソースの値は異なります。
フォアグラウンドのコマンドは、終了までターミナルを占有します。sleep は何も出力せずに、指定した秒数だけ待ちます。意図的に長い待機を開始します。
sleep 30
Ctrl+C でこのフォアグラウンドコマンドを中断し、プロンプトに戻ります。Ctrl+C は、現在ターミナルを占有しているコマンドを停止したい場合に便利です。
末尾の & はコマンドをバックグラウンドで開始し、シェルがすぐに次のコマンドを受け付けられるようにします。一時的なタイマーを一つ起動します。
sleep 300 &
シェルは [1] のようなジョブ番号と PID を表示します。jobs -l は、このシェルに属するバックグラウンドジョブを PID 付きで一覧表示します。
jobs -l
sleep 300 ジョブが実行中のはずです。このステップのチェックでは動かしたままにします。ジョブ番号はこのシェルセッションに属するので、次のステップでも同じターミナルを開いたままにしてください。
停止状態のワーカーだけを終了してログを読む
このステップでは、選択した演習プロセスを終了し、別のワーカーを維持して、関連するエラー行を保存します。
同じ Kali シェルで、一時的なバックグラウンドタイマーを停止します。kill はシグナルを送り、既定の終了シグナルはプロセスに終了を要求します。ジョブ参照 %1 は、この新しいシェルで最初に作成したジョブを指します。
kill %1
シェルが終了通知を表示する場合があります。自分のシェルジョブとして起動していないプロセスは、まず PID を特定します。pgrep -a は一致した PID と完全なコマンドラインを表示し、-f は完全なコマンドラインを照合します。
pgrep -af stalled-worker.py
対象のコマンドは python3 /opt/labex/stalled-worker.py です。これは無期限に待機する無害な演習ワーカーです。別の training-heartbeat.py ワーカーは動かしたままにする必要があります。
コマンド置換で、見つけた PID を kill に渡せます。$(...) は内側のコマンドを実行して出力を置き換え、ダブルクォートはその出力を一つの引数として保持します。アンカー ^ と $ は、広範な部分名ではなく、期待するコマンド全体に一致させます。その正確なワーカーだけを終了します。
kill "$(pgrep -f '^python3 /opt/labex/stalled-worker.py$')"
一度だけ実行してください。終了後に繰り返すと PID は見つかりません。コマンドは何も表示せず戻るはずです。維持すべきワーカーがまだ存在することを確認します。
pgrep -af training-heartbeat.py
PID は異なる場合がありますが、そのコマンドパスは引き続き表示されるはずです。
アプリケーションログは、イベントをテキストで記録します。提供された演習ログは worker.log です。systemd やカーネルログへのアクセスは不要です。ログを読みます。
cat /home/labex/project/worker.log
ログには情報メッセージと、止まった操作を説明する ERROR 行が混在しています。学習済みの絞り込みとリダイレクトで、エラー記録だけを保存します。
grep '^ERROR ' /home/labex/project/worker.log > /home/labex/project/worker-errors.txt
cat /home/labex/project/worker-errors.txt
想定される出力:
ERROR training request exceeded its time limit
選択したワーカーを終了し、無関係なワーカーを維持して、その診断情報をログ全体とは別に保存できました。
まとめ
プロセス ID、所有者、コマンドラインを調べ、フォアグラウンドの中断とバックグラウンドジョブを観察し、対象を絞った終了シグナルを送り、アプリケーションログを絞り込みました。選択した停止状態のプロセスを終了し、無関係なワーカーは維持しました。



