プログラムを実行し続けるサービスを入手するには?

プログラムを実行し続けるサービスを入手するには?

thin_keep_alive_serviceにサービス依頼をしました/etc/init.d。私はそれにchmod +x権利を与えた。スクリプトは次のとおりです。

#!/bin/bash

### BEGIN INIT INFO
# Provides:          thin_keep_alive_service
# Required-Start:    $local_fs $network
# Required-Stop:     $local_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description  Keeps Thin servers running
# Description:       This service checks every 30 seconds if at least 
#                    two light weight thin web servers are alive and 
#                    restarts them all from the bundle if not.
###END INIT INFO

while true
do
    # Store an array of the pids of thin
    thin_pid_arr=($(pgrep -f thin))

    # When there are less than two Thin servers left we reboot them all
    if [ ${#thin_pid_arr[@]} -lt 2 ]; then
        cd /root_to_app && bundle exec thin -C /etc/thin/app.yml restart
    fi

    #Wait 30 seconds before checking again
    sleep 30
done

私がそれを実行すると、それは動作しますservice thin_keep_alive_service start。しかし、起動した後、私のサーバーの2つはしばらくしてシャットダウンし、新しいサーバーが再起動されなかったため、バックグラウンドで実行され続けます。

バックグラウンドで実行されていることを確認するにはどうすればよいですか?

答え1

2つ:

  1. 初期化スクリプトは少なくとも開始および停止コマンドをサポートする必要があり、初期化スクリプトに無限ループがあると、スクリプトが呼び出されると起動プロセスが中断されることがよくあります。

  2. 何をすべきかわかりませんが、bundle exec thin restartスクリプトが大丈夫なので問題がある可能性があります。つまり、この部分はあなたが思うように行われません。set -x期待どおりにコマンドが実行されていることを確認するためにスクリプトを配置できます。

つまり、サービスを自動的に再起動するには、このようなプロセスマネージャを使用することがほぼ確実にきちんとなります。走る

市。while sleep 30代わりにfork()を使用して削除できますwhile true; do ... sleep 30; done。 :)

答え2

起動後、すべてのサーバーを起動する実行レベルスクリプト(/ etc / init.d / thinの下にある)でThinをインストールできます。

sudo thin install

そして、起動する各アプリケーションのプロファイルを設定します。

thin config -C /etc/thin/myapp.yml -c /var/...

すべてのオプションを取得するには、Thin -h を実行します。

読む薄い文書

答え3

述べたように、初期化スクリプトをブロックするループはあってはなりません。

私がすることは、サービスと見なされる別のスクリプトを作成することです。そのスクリプトにはループがあり、フォアグラウンドでサービスが開始されるため、ループは本当に簡単になります。

#!/bin/sh
while true
do
    start-service ...
    sleep 30
done

初期化ファイルでサービスを開始するシンメカニズムまたは他のメカニズムを使用してそのスクリプトを参照するため、サービスが継続的に実行されることを保証するレイヤを追加しました。

これで、ユーザーがサーバーを停止しようとしたときに知る方法が必要になる可能性があります。ループには次のものはありません。

#!/bin/sh
while true
do
    start-service ...

    # service properly terminated?
    if ! test -f /var/run/service-id
    then
        exit 0
    fi

    sleep 30
done

/var/run/service-id ファイルが削除された場合~前に「サービスの開始」ソフトウェアが返されると問題はありません。これは、サービスがクラッシュしてもファイルが自動的に削除されるべきではないという意味でもあります。

たぶん、サービスの戻り値を使用することができます。この場合、代わりに次のことを行うことができます(サービス自体がブロックされている場合にのみ機能することに注意してください)。

#!/bin/sh
while true
do
    if start-service ...
    then
        # service cleanly terminated
        exit 0
    fi

    sleep 30
done

この種のアクションはアプリを自動的に再起動しますが、アプリがクラッシュするのではなく終了し続ける場合は何もしません。悪いしばらくして(つまり遅くなる可能性がある)、停止するにはより多くの経験的な方法が必要です。

答え4

これを行う他の方法があります。最も一般的なLinuxディストリビューションでは、プロセスが実行されていることを確認し、そうでない場合は操作を実行するために使用できますupstart。私が現在使用しているもう一つの良いオプションですsystemd

しかし、サードパーティのソフトウェアを使用するには、monitとgodrbを見てください。

関連情報