Capistrano2 展開操作後のサービスの開始に失敗する

Capistrano2 展開操作後のサービスの開始に失敗する

/etc/init.d以下はデーモンを制御するスクリプトの一部です。完全なinit.scriptは次の場所にあります。http://pastebin.com/02G5tpgH

case "$1" in
start)
        printf "%-50s" "Starting $DAEMON_NAME..."
        cd $DIR
        [ -d $LOGPATH ] || mkdir $LOGPATH
  [ -f $LOGFILE ] || su $DAEMON_USER -c 'touch $LOGFILE'
        PID=`$PYTHON $DAEMON $DAEMON_OPTS > $LOGFILE  2>&1 & echo $!`
        #echo "Saving PID" $PID " to " $PIDFILE
        if [ -z $PID ]; then
            printf "%s\n" "Fail"
        else
            echo $PID > $PIDFILE
            printf "%s\n" "Ok"
        fi
;;
status)
        printf "%-50s" "Checking $DAEMON_NAME..."
        if [ -f $PIDFILE ]; then
            PID=`cat $PIDFILE`
            if [ -z "`ps axf | grep ${PID} | grep -v grep`" ]; then
                printf "%s\n" "Process dead but pidfile exists"
            else
                echo "Running"
            fi
        else
            printf "%s\n" "Service not running"
        fi
;;
stop)
        printf "%-50s" "Stopping $DAEMONNAME"
            PID=`cat $PIDFILE`
            cd $DIR
        if [ -f $PIDFILE ]; then
            kill -HUP $PID
            printf "%s\n" "Ok"
            rm -f $PIDFILE
        else
            printf "%s\n" "pidfile not found"
        fi
;;

restart)
        $0 stop
        $0 start
;;

*)
        echo "Usage: $0 {status|start|stop|restart}"
        exit 1
esac

私はこのアプリケーションをデプロイ/アップデートするためにcapistrano2を使用します。そのため、デプロイ前にアプリケーション/サービスを停止するタスクがあり、デプロイ後にサービスを開始するもう1つのタスクがあります。このプロセス中に、capistrano 操作でサービスが正常に開始されません。エラーが発生します。

プロセスは終了しますが、pidfileは存在します。

手動停止と起動は問題を再現できません。一種のデーモン問題のようです。スクリプトを介して呼び出すと、サービスは開始されません。

編集する:

これまでの証拠によると、スクリプトのこの部分が失敗したようです。

case "$1" in
start)
        printf "%-50s" "Starting $DAEMON_NAME..."
        cd $DIR
        [ -d $LOGPATH ] || mkdir $LOGPATH
  [ -f $LOGFILE ] || su $DAEMON_USER -c 'touch $LOGFILE'
        PID=`$PYTHON $DAEMON $DAEMON_OPTS > $LOGFILE  2>&1 & echo $!`
        if [ -z $PID ]; then
            printf "%s\n" "Fail"
        else
            echo $PID > $PIDFILE
            printf "%s\n" "Ok"
        fi
;;

答え1

これはとても奇妙です。これがあなたのスクリプトであれば、エラー/失敗の理由を生成するスクリプトではないか、Capistranoが端末以外の場所に標準出力を送信しています。

提供したコードの最初の行は次のとおりですcat: /var/run/daemon_name.pid: No such file or directory。猫がいるところはstatusandstopゾーンだけです。したがって、Checking...またはStopping...出力を表示する必要がありますが、そうではありません。少なくともあなたはそれを示していません。

val0x00ff ファイルの上部に set -x を使用することをお勧めします。出力が多すぎる場合は、以下を試してください。

お客様のケース ステートメントに次のような情報を追加します。

echo "Got here" 1>&2

その後、メッセージがstderrに送信され、何が起こっているかを確認できます(明らかにcatのエラーはstderrに送信されます)。

PID= `cat $PIDFILE`上記のコードの各ステートメントの前に、次のようにします。

{ date; hostname; ls -l /var/run; } 1>&2

すべてが正しいことを確認してください。

変数名と逆引用符を変更すると、bashコードがより標準化されたり、最新の状態になる可能性がありますが、これは問題の原因ではありません。

答え2

その理由は、カピストラノ自体ではありません。これは、capistranoによって生成されたプロセスがジョブの終了時に終了したときに終了するという事実によるものです。この問題を解決するには、initスクリプトを変更する必要があります。 「nohup」は、SSHセッションを制限した後でもデーモンをbgに保持するために使用されます。以下は、(開始)initスクリプトの修正部分です。

case "$1" in
start)
    #checking to see if the process is already running, if it is, display a message and exit
    if [ -n "`ps aux |grep  /opt/mount/xyz/current/src/main.py | grep -v grep`" ]; then
      echo "Service is already running, try stopping it first with 'service xyz stop'"
      exit
    fi

    printf "%-50s" "Starting $DAEMON_NAME..."
    cd $DIR
    [ -d $LOGPATH ] || mkdir $LOGPATH
  [ -f $LOGFILE ] || su $DAEMON_USER -c 'touch $LOGFILE'
    nohup $PYTHON $DAEMON $DAEMON_OPTS > $LOGFILE  2>&1 &
    echo $! > $PIDFILE
    sleep 5
;;

関連情報