システムスケジューラによって指定された間隔で実行されるボットがあります。しかし、時には、いくつかの論理エラーのためにこれらのボットを手動で停止する必要があります。スケジューラで実行されているこれらのプロセスを見つけて終了するにはどうすればよいですか?
答え1
名前でプロセスを終了できます。たとえば、Linux、* BSD、およびSolarisでは、pkill myprogram
名前に(正確な一致のために)含まれるすべてのプロセスを終了します。 root以外のユーザーとして実行すると、そのユーザーのプロセスのみが終了し、一致を制御するための追加オプションがあります(詳細についてはシステムのマニュアルを参照)。myprogram
pkill '^myprogram$'
スケジューラによって開始されたプロセスを具体的にターゲットとして指定し、プロセスを手動で終了したい場合ps f
(Linuxのみ)またはpstree
(Linuxのみ)ptree
ツリーにプロセスを表示し、cronによって開始されたプロセスを確認してください。
ホームフロー方式を使用してこれらのプロセスを自動的に終了するには、プロセスIDをファイルに保存する必要があります。この種のファイルpidファイルプロセスの単一インスタンスのみを実行するために使用される場合(必要なものでもそうでない場合もあります)。複数のインスタンスが必要な場合は、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"
ランアウェイプロセスを検出するための厳しい基準がある場合のより良い解決策は、汎用モニターを使用するか、簡単な場合にプロセスの実行が許可される時間を制限することです。次のリンクが役に立ちます。
- 」監視装置実行していない場合はプロセスを開始し、応答がない場合は再起動し、リソースが多すぎる場合は停止できます。 」
- ランアウェイプロセスを監視して終了するには、cronjobのヘルプが必要です。
- CPU + RAMを節約するために特定のプロセスのリソース使用量を制限する方法は?
- Unixで特定のプロセスが使用できるメモリ量を制限する方法はありますか?
答え2
PID($$)を作成したら、ファイルに入れることをお勧めします。その後、それを使用してプロセスを終了できます。
答え3
無限ループやその他のエラー条件を見つけるために、ほとんどのプログラミング言語で使用されるデフォルトのtry / catchブランチが機能する必要があります。停止を監視するために、プロセスに非アクティブ/応答なしタイマーがある可能性があります。