/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
。猫がいるところはstatus
andstop
ゾーンだけです。したがって、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コードがより標準化されたり、最新の状態になる可能性がありますが、これは問題の原因ではありません。