我在upstart中看到一个问题,即在启动后脚本节中使用命令替换会导致错误(syslog报告“以状态1终止”),但仅在初始系统启动期间。
我尝试过在阳光下使用几乎每个启动事件挂钩。 local-filesystems和net-device-up在没有错误的情况下工作了大约1/100次尝试,所以它看起来像竞争条件。它在手动启动/停止时工作得很好。我见过的命令替换触发错误是一个简单的猫或日期,我尝试使用$()方式和反引号方式。我也试过在开始前使用睡眠来击败比赛状态,但这没有做任何事情。
我在VMWare上使用Win7主机运行Ubuntu 11.10。花了太多时间对此进行故障排除......任何人都有任何想法?
这是我的.conf文件供参考:
start on runlevel [2345]
stop on runlevel [016]
env NODE_ENV=production
env MYAPP_PIDFILE=/var/run/myapp.pid
respawn
exec start-stop-daemon --start --make-pidfile --pidfile $MYAPP_PIDFILE --chuid node-svc --exec /usr/local/n/versions/0.6.14/bin/node /opt/myapp/live/app.js >> /var/log/myapp/audit.node.log 2>&1
post-start script
MYAPP_PID=`cat $MYAPP_PIDFILE`
echo "[`date -u +%Y-%m-%dT%T.%3NZ`] + Started $UPSTART_JOB [$MYAPP_PID]: PROCESS=$PROCESS UPSTART_EVENTS=$UPSTART_EVENTS" >> /var/log/myapp/audit.upstart.log
end script
post-stop script
MYAPP_PID=`cat $MYAPP_PIDFILE`
echo "[`date -u +%Y-%m-%dT%T.%3NZ`] - Stopped $UPSTART_JOB [$MYAPP_PID]: PROCESS=$PROCESS UPSTART_STOP_EVENTS=$UPSTART_STOP_EVENTS EXIT_SIGNAL=$EXIT_SIGNAL EXIT_STATUS=$EXIT_STATUS" >> /var/log/myapp/audit.upstart.log
end script
答案 0 :(得分:1)
我能想到的最可能的情况是$MYAPP_PIDFILE
尚未创建。
因为您没有指定'期望' stanza,只要主进程分叉并执行,就会运行post-start。因此,正如您所怀疑的那样,start-stop-daemon
正在运行的节点与编写该pidfile和/bin/sh
之间可能存在竞争,并且再次执行cat $MYAPP_PIDFILE
执行post-start script
for i in 1 2 3 4 5 ; do
if [ -f $MYAPP_PIDFILE ] ; then
echo ...
exit 0
fi
sleep 1
done
echo "timed out waiting for pidfile"
exit 1
end script
。
这样做的正确方法是重写你的启动后:
/var/log/upstart/$UPSTART_JOB.log
值得注意的是,在Upstart 1.4(首先包含在Ubuntu 12.04中)中,upstart增加了日志记录功能,因此无需将输出重定向到特殊的日志文件中。所有控制台输出默认为{{1}}(由logrotate旋转)。所以这些回声可能只是回声。