プログラムの並列実行を防ぐために PID ファイルを使用するデーモンがいくつかあります。SIGTERM をトラップし、PID ファイルを含む必要なクリーンアップを行うシグナル ハンドラをセットアップしました。「kill -s SIGTERM #PID」を使用してテストすると、これはうまく機能します。ただし、サーバーを再起動すると、PID ファイルがまだぶら下がっていて、デーモンの起動を妨げています。サーバーのシャットダウン時に SIGTERM がすべてのプロセスに送信されることを理解しています。デーモンで別のシグナル (SIGINT、SIGQUIT?) をトラップする必要がありますか?
3 に答える
4
flock
pidfile で(または) を使用lockf
します。成功した場合は、pidfile を書き換えて続行できます。
This SO answerには、これがどのように行われるかについての良い例があります。
于 2010-01-25T19:25:23.580 に答える
3
直接的な解決策ではありませんが、起動時に pid ファイル内の pid で実行されている実際のプロセスを確認し、存在しない場合は古いファイルをクリーンアップすることをお勧めします。
pid ファイルをクリーンアップする前に、プロセスが SIGKILL を受け取っている可能性があります。
于 2010-01-25T18:57:56.577 に答える
2
すべてのプロセスに SIGTERM を送信した後、カーネルはしばらく (通常は約 2 ~ 3 秒) 待機してから、SIGKILL を送信することに注意してください。または類似のものを見つけることができます/etc/rc.d/rc0.d/S01halt
(ディストリビューションによって異なる場合があります)。
たとえば、私の Fedora 11 では次のようになります。
action $"Sending all processes the TERM signal..." /sbin/killall5 -15
sleep 2
action $"Sending all processes the KILL signal..." /sbin/killall5 -9
したがって、十分に速くない場合は、遅延を増やすか、確実に速くなるようにしてください!
于 2010-01-25T19:12:50.127 に答える