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


10

ウェブサーバーで実行されているいくつかのプロセスを監視する必要があります。なんらかの理由で、現在、ワニスは毎日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はニスの監視を停止します。

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


このようなことがシステム化前の時代にどれほど困難であったかは信じられません。
Fl0v0

回答:


17

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

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

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


不安定なサービスプロセスを監視するために、daemontoolsも使用しています。私が言わなければならない場合は非常に便利です。:-)
edomaur 2009


2

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ジョブとして実行します。


私は最初はNagiosを検討しましたが、私の目的のために小さくてシンプルなものが欲しかったです。はい、ワニスの問題を調査しています。私のサーバーの1つは非常に長い間安定して稼働しているので、間違いなく私と関係があります。:(

1

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の答えを、これは良いアプローチである理由の詳細な説明のために。


0

この問題を処理する最も簡単な方法も探していました。私が見つけることができる最も簡単な方法は、タグの最後の行として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以降
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.