/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
. 고양이가 있는 곳은 status
and 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
;;