3

プログラムの並列実行を防ぐために PID ファイルを使用するデーモンがいくつかあります。SIGTERM をトラップし、PID ファイルを含む必要なクリーンアップを行うシグナル ハンドラをセットアップしました。「kill -s SIGTERM #PID」を使用してテストすると、これはうまく機能します。ただし、サーバーを再起動すると、PID ファイルがまだぶら下がっていて、デーモンの起動を妨げています。サーバーのシャットダウン時に SIGTERM がすべてのプロセスに送信されることを理解しています。デーモンで別のシグナル (SIGINT、SIGQUIT?) をトラップする必要がありますか?

4

3 に答える 3

4

flockpidfile で(または) を使用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 に答える