web-dev-qa-db-ja.com

クラッシュしたプロセスを再起動する簡単な方法は?

Webサーバーで実行されているいくつかのプロセスを監視する必要があります。何らかの理由で、現在、ワニスは1日に1〜2回クラッシュします。 monitを使用してワニスを自動的に再起動すると思われますが、機能しません。 Varnishのmonit.confエントリを次に示します。

check process varnish with pidfile /var/run/varnish.pid
    start program = "/etc/init.d/varnish start" with timeout 60 seconds
    stop program = "/etc/init.d/varnish stop"
    if failed Host <my server ip> port 80 protocol http
        and request "/blank.html" then restart
    if 3 restarts within 5 cycles then timeout
    group server

ログファイルは、ワニスの実行が停止した後、再試行がすべて失敗したことを示しています。その後、最終的にmonitはニスの監視を停止します。

誰でもこれを修正する方法についての提案がありますか?さらに良いことに、クラッシュしたプロセスを自動的に監視して再起動する他の簡単な方法を提案できますか?ありがとう!

10
Lin

私はdaemontools( http://cr.yp.to/daemontools.html )を調べます。

Superviseは、まさにこの目的のために構築されました。プロセスを開始して監視し、終了した場合は即座に再起動するためです。

単純な「それがまだ実行されているか」チェックよりも複雑なことを行う必要がある場合は、monitを引き続き使用できます。プロセスを再起動する必要がある場合は、監視によって再実行します。

17
Ian Clelland

/ etc/inittabを使用して、respawnアクション。

http://aplawrence.com/Unixart/startup.html のinittabセクションを参照してください==

4
Shawn Chin

Nagiosでのイベントハンドラスクリプト を使用して、サービスを再起動できます。

Varnishを起動するためにroot権限が必要な場合(init.dスクリプトは通常必要です)、「/ etc/init.d/varnish start」を「Sudo /etc/init.d/varnish start」に変更します。しかし、すべてのコマンドにSudoのnopasswd特権を合計してユーザーモニターを実行したくない場合や、Sudoをシェルスクリプトに付与する場合も、基本的に同じように悪いので、おそらくそれだけでは十分ではありません。そのため、そのinitスクリプト内のどのコマンドがSudoを必要とするかを把握し、それらのコマンドに/ etc/sudoersファイル内のSudo特権をmonitユーザーに付与し、最後にそれに応じてそのinitスクリプトを編集する必要があります。あるいは、このワニスをすべてroot以外のユーザーとして実行する代わりに、

最後に、私はあなたがこれを知っていると確信していますが、とにかくそれを言うつもりです。あなたは明らかにこれに多くの努力を注いでいます。ワニスがクラッシュする理由を解明し、実際にそれを修正する(または開発者に理由を突き止める)ために多くの努力を払ってほしいと思います:-)

更新:
これはそれほどクリーンではないかもしれませんが、rootとしてこれを行う簡単な方法は、プロセスが正常かどうかをチェックし、開始しない場合にチェックするスクリプトを設定することです。次に、そのスクリプトを数分ごとにcronジョブとして実行します。

2
Kyle Brandt

別の優れた方法 StackOverflowから取得

until myserver; do
    echo "Server 'myserver' crashed with exit code $?.  Respawning.." >&2
    sleep 1
done

これはcrontabに追加できます:

crontab -e

次に、監視スクリプトを開始するルールを追加します。

@reboot /usr/local/bin/myservermonitor

または、/etc/init.dにスクリプトとして追加

これが良いアプローチである理由の詳細な説明については、 StackOverflowの回答 を参照してください。

1
Cory Klein

この問題を処理する最も簡単な方法も探していました。私が見つけることができる最も簡単な方法は、Restart=allwaysタグの最後の行として.serviceの関連する/etc/systemd/system/multi-user.target.wants/ファイルに[service]を追加することです。

その後、Sudo systemctl daemon-reloadに続けてSudo systemctl restart service.serviceを実行して、変更を再読み込みします。

サービスが実行されているかどうかを確認することでテストできます:systemctl status processname、開始タイムスタンプを確認してください。その後、ps -ef | grep servicenameを実行し、検出されたばかりのID kill 1234のプロセスを強制終了します。その後、再度systemctl status processnameを実行し、開始タイムスタンプが更新されているかどうかを確認します。

それは動作するはずです:

  • Debian 7およびDebian 8
  • Ubuntu 15.04以降
  • CentOS 7以降
0
RoDo