Upstart:在启动序列期间在启动后脚本节中使用命令替换时出错

时间:2012-05-03 16:06:05

标签: linux ubuntu sh upstart

我在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

1 个答案:

答案 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旋转)。所以这些回声可能只是回声。