(VMWare)VMでRed Hat Linux(RHEL5)を使用しています。常に実行され続け、起動時に自動的に実行されるデーモンを作成しました。
昨夜、VMホストに回復不能なハードウェアの問題があり、VMが突然停止しました。戻ったとき、pidfileがまだ存在していたため、デーモンが起動しませんでした。 。
どうやらこれは The Stale pidfile Syndrome と呼ばれていますが、それを軽減するための最良の長期的アプローチが何であるかはわかりません。 /etc/rc.d*
の起動スクリプトはデーモンを起動する前にpidfileを削除する必要があると思いますが、/etc/init.d
のサービス管理スクリプトは同じままにして、service mydaemon start
のようなものが壊れることがないようにする必要がありますpidfile。
/etc/rc.d/rc6.d
には/etc/init.d/
のスクリプトへのシンボリックリンクがあるだけなので、起動時のみの動作を変更するにはどうすればよいですか? rc.d
dirsで優先順位の高い追加のスクリプトを作成できますが、ハッキーのようです。 「uptimeが1分未満の場合は、pidfileを削除する」などのロジックを追加することも提案されましたが、これもハッキーのようです。
考えや解決策、またはベストプラクティスはありますか?
daemontools を使用し、 Process Management を参照してください。
@Dennisと@coredumpのヒントをありがとうございます。
謎を解き明かすのに役立ついくつかの追加情報を見つけました。
なぜ他のすべてのデーモンが正常に回復したのか疑問に思いました。起動時に/etc/rc.d/rc.sysinit
と/var/run
のすべてのpidfileをクリーンアップするコードが/var/lock
にあることがわかりました。
SELinuxで問題が発生し、「誤ってラベル付けされた可能性のあるファイルを使用」できなくなったため、pidfileを別の場所に配置するようにデーモンを構成しました。
したがって、SELinuxの問題のためにまだ修正していませんが、答えは"pidfileを/var/run
または/var/lock
に入れれば、次回は機能します"
スクリプトは同じです。起動プロセスは、sysvinitスクリプトに対して「start」アクションを実行するだけです。
Pidファイルのpidが正しいかどうかを確認し、削除せずに正しいpidで新しいpidを作成してみませんか?
[〜#〜] edit [〜#〜]:pidfileを使用してpsをgrepして、プロセスがまだ存在するかどうかを確認できます。または、その逆を行います。 RedHat initscriptsを確認してください。これを行うには、pidofproc
などのヘルパー関数がいくつかあると思います。