web-dev-qa-db-ja.com

サーバーの再起動/プロセスの終了時にプロセスを自動的に再起動するにはどうすればよいですか?

私のUbuntuサーバーでは God を使用して、いくつかのRubyプロセス/スクリプト(キューシステムを含む))を監視しています。

神は私のプロセスの1つが存在することを自動的にチェックし、それを再開します。また、メモリ使用量を追跡し、特定の条件がトリガーされたときに適切に動作します。今日、サーバーを再起動しましたが、しばらくすると、キューが機能しないことに気付きました。簡単なチェックの結果、サーバーの再起動後に神が再起動されていないことがわかりました(私はそうするはずです)。

サーバーの再起動時、または何らかの理由でプロセスが強制終了されたときに、神(または一般的なプロセス)が自動的に再起動されるようにするための最良の方法は何ですか?

私が神を始めるために使う特定の命令は

god -c config
5
Simone Carletti

ここにいくつかのオプションがあります。他の推奨事項を読むのではなく、1つの推奨事項が必要な場合は、最後の段落にスキップしてください。

再起動時に再起動するだけで簡単です。Debianベースのディストリビューション(および他の多くのディストリビューション)がデフォルトで他の起動スクリプトのすべての後に実行する/etc/rc.localに追加します。 godがバックグラウンド自体にドロップしない場合は、次のようにコマンドのnedに注意を払う必要があります。

god -c config &

ただし、上記の方法では、プロセスが強制終了されても再起動されません。無限ループのスクリプトを作成することもできますが、これは面倒で、本当に強制終了させたいときに問題を引き起こします。

/etc/init.dのスクリプトをモデルにした独自の初期化スクリプトを作成することもできます(そして/etc/rc.* 'にリンクされます)。ただし、追加のスクリプトを作成しなければ、サービスは自動的に開始されません。

それを/etc/inittabに追加すると、initがプロセスを管理し、起動時に開始し、停止した場合は再起動します。短時間で頻繁に死ぬと、再起動も停止します。しかし、これはまだ完璧ではありません。

あなたが説明したことに対して一般的に推奨されるアプローチはdaemontoolshttp://en.wikipedia.org/wiki/Daemontools )であり、サービスが停止した場合のサービスの再起動もサポートしています。これは、ここでは/etc/initabのエントリを使用するよりも少し手間がかかりますが、質問で尋ねたすべてのことを実行する、はるかにクリーンな最終製品になります。 daemontoolsは、ほぼすべてのLinuxディストリビューションのリポジトリにあります。

8
David Spillett

プロセスが常に実行されていることを確認する場合は、プロセスが停止した場合にプロセスを再起動するため、inittabを使用するのが賢明な方法です。ただし、コードが改善されてマシンが不安定になる可能性が低くなるので、失敗するかのように私はこの方法でこれを実行しません。

Rootアクセス権がある場合は、/ etc/init.dにinitスクリプトを作成してから、update-rc.dを使用して実行レベルのディレクトリに正しいシンボリックリンクを作成します。スクリプトの例は次のようになります

 #!/bin/bash
 ### BEGIN INIT INFO
 # Provides:          god
 # Required-Start:    $syslog
 # Required-Stop:     $syslog
 # Default-Start:     2 3 4 5
 # Default-Stop:      0 1 6
 # Short-Description: Runs the Ruby god meta server.
 # Description:       Runs the Ruby god meta server.
 ### END INIT INFO

 start_daemon () {

        Nohup start-stop-daemon --start --quiet -m --pidfile /var/run/god.pid \
        --exec  god -- -c config 
        RETVAL=$?
 }

 stop_daemon () {
    start-stop-daemon --stop --quiet --oknodo -m --pidfile /var/run/god.pid 
    RETVAL=$?
 }


 case "$1" in 

 start)
 start_daemon
 ;;
 stop)
 stop_daemon
 ;;
 restart | reload | force-reload )
 stop_daemon
 start_daemon
 ;;
 esac

普通のユーザーであれば、cronを使用して、起動時間を@rebootと指定することで、起動時にプロセスを実行できます。

@reboot god -c config
3
James

神を開始および停止するには、init.dスクリプトを記述する必要があります。例として、/ etc /init.dの下にある任意のスクリプトを使用できます。新しいスクリプト/etc/init.d/godを呼び出します。次に実行できます

# update-rc.d god defaults

また、サーバーの起動時とシャットダウン時に開始および停止することを確認する必要があります。インターネット上には、神のためのinit.dスクリプトがすでに存在していることに気付くかもしれません。あなたが座ってそれを書く前に、私は簡単な検索をするでしょう。

1
David Pashley

起動時にgodが確実に再起動するようにするには、スクリプトをinitスクリプトに追加する必要があります。これを行うには、少なくともパラメーターとして開始を受け入れるスクリプトを記述します(標準に従うには、それ)そしてそれを/etc/init.d/に貼り付けます。次に、S99と呼ばれるシンボリックリンクを/ etc/rcに追加します[スクリプトで開始する実行レベルに関係なく]。

理想的には、標準に準拠するために、/ etc/init.d/skeletonを/etc/init.d/内の別の場所にコピーし、それに合わせて編集します。

0
Cian