与えられた時間間隔でシステムスケジューラによって実行されるボットがいくつかあります。しかし、論理的なエラーが原因で、これらのボットを手動で停止しなければならない場合があります。スケジューラによって実行されているこれらのプロセスを見つけて強制終了するにはどうすればよいですか?
承認された回答:
名前でプロセスを強制終了できます。たとえば、Linux、* BSD、Solarisでは、pkill myprogram
名前にmyprogram
が含まれているすべてのプロセスを強制終了します (pkill '^myprogram$'
を使用します 完全一致の場合)。 root以外のユーザーとして実行すると、そのユーザーのプロセスのみが強制終了され、マッチングを制御するためのオプションがさらに追加されます(詳細については、システムのマニュアルを参照してください)。
スケジューラによって開始されたプロセスを具体的にターゲットにし、プロセスを手動で強制終了する場合は、ps f
を実行できます。 (Linuxのみ)またはpstree
(Linuxのみ)またはptree
プロセスをツリーに表示し、どのプロセスがcronによって開始されたかを確認します。
自家製の方法でこれらのプロセスを自動的に強制終了できるようにする場合は、プロセスIDをファイルに保存するようにします。この種のファイルは、プロセスの単一のインスタンスのみを実行するために使用される場合、pidfileと呼ばれます(これは、必要なものである場合とそうでない場合があります)。複数のインスタンスが必要な場合は、PIDを共通ディレクトリの個別のファイルに保存します。これを行うシェルスニペットは次のとおりです:
pid_dir=/var/run/myprogram # must have been created e.g. at boot time
myprogram &
pid_file=$pid_dir/$!.pid
touch "$pid_file"
wait
rm "$pid_file"
暴走したプロセスを検出するための厳しい基準がある場合、より良い解決策は、一般的な監視プログラムを使用するか、単純なケースでは、プロセスの実行を許可する期間に制限を設けることです。これらのリンクが役立つ場合があります:
- 「Monitは、実行されていない場合はプロセスを開始し、応答しない場合はプロセスを再開し、リソースを使いすぎる場合はプロセスを停止できます。」
- 暴走するプロセスを監視して強制終了するには、cronジョブのサポートが必要です
- 特定のプロセスのCPU+RAMを節約するためにリソース使用量を制限するにはどうすればよいですか?
- 特定のプロセスがUnixで使用できるメモリの量を制限する方法はありますか?