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를 사용합니다. 따라서 배포 전에 애플리케이션/서비스를 중지하는 작업이 있고 배포 후 서비스를 시작하는 또 다른 작업이 있습니다. 이 프로세스 중에는 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. 고양이가 있는 곳은 statusand stop구역뿐이에요. 따라서 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
;;

관련 정보