Linux Upstart:在启动序列期间,在启动后脚本节中使用命令替换时出错
我在upstart中看到一个问题,即在启动后脚本节中使用命令替换会导致错误(syslog报告“以状态1终止”),但仅在初始系统启动期间 我试过使用几乎所有的启动事件挂钩。本地文件系统和网络设备运行正常,大约1/100次尝试都没有出错,所以看起来像是竞争条件。它在手动启动/停止时工作正常。我看到的触发错误的命令替换是一个简单的cat或date,我尝试了使用$()方式和backtick方式。我也尝试过在赛前使用睡眠来战胜比赛条件,但那没有任何效果 我正在使用Win7主机在VMWare上运行Ubuntu11.10。已经花了太多时间对此进行故障排除。。。有人有什么想法吗 以下是我的.conf文件供参考:Linux Upstart:在启动序列期间,在启动后脚本节中使用命令替换时出错,linux,ubuntu,sh,upstart,Linux,Ubuntu,Sh,Upstart,我在upstart中看到一个问题,即在启动后脚本节中使用命令替换会导致错误(syslog报告“以状态1终止”),但仅在初始系统启动期间 我试过使用几乎所有的启动事件挂钩。本地文件系统和网络设备运行正常,大约1/100次尝试都没有出错,所以看起来像是竞争条件。它在手动启动/停止时工作正常。我看到的触发错误的命令替换是一个简单的cat或date,我尝试了使用$()方式和backtick方式。我也尝试过在赛前使用睡眠来战胜比赛条件,但那没有任何效果 我正在使用Win7主机在VMWare上运行Ubunt
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
我能想到的最可能的情况是,
$MYAPP_PIDFILE
尚未创建
因为您没有指定“expect”节,所以一旦主进程分叉并执行,就会运行post start。因此,正如您所怀疑的,在运行节点的启动停止守护进程和写入该pidfile和分叉、执行以及再次分叉到exec之间可能存在一场竞赛
正确的方法是重写您的开机自检:
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
值得注意的是,在Upstart 1.4(首先包含在ubuntu12.04中)中,Upstart添加了日志功能,因此无需将输出重定向到特殊的日志文件中。所有控制台输出默认为
/var/log/upstart/$upstart\u JOB.log
(由logrotate旋转)。因此,这些回声可能只是简单的回声。我能想到的最可能的情况是,$MYAPP_PIDFILE
尚未创建
因为您没有指定“expect”节,所以一旦主进程分叉并执行,就会运行post start。因此,正如您所怀疑的,在运行节点的启动停止守护进程和写入该pidfile和分叉、执行以及再次分叉到exec之间可能存在一场竞赛
正确的方法是重写您的开机自检:
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
值得注意的是,在Upstart 1.4(首先包含在ubuntu12.04中)中,Upstart添加了日志功能,因此无需将输出重定向到特殊的日志文件中。所有控制台输出默认为
/var/log/upstart/$upstart\u JOB.log
(由logrotate旋转)。因此,这些回音可能只是简单的回音。这里不需要命令替换,date
可以很好地打印内容<代码>日期-u+“[%Y-%M-%Dt%t.3NZ]-启动$UPSTART\u作业[$MYAPP\u PID]:进程=$PROCESS UPSTART\u事件=$UPSTART\u事件”>>/var/log/MYAPP/audit.UPSTART.log。。。假设您的变量不包含任何需要转义的%-序列。是的,我可能能够避免用命令替换date,但据我所知,不能用命令替换cat。如果我能找到一种方法,在不使用命令替换的情况下将PID输入日志条目,那么你说我可以绕过整个问题的权利。你在这里真的不需要命令替换,date
可以很好地打印内容<代码>日期-u+“[%Y-%M-%Dt%t.3NZ]-启动$UPSTART\u作业[$MYAPP\u PID]:进程=$PROCESS UPSTART\u事件=$UPSTART\u事件”>>/var/log/MYAPP/audit.UPSTART.log。。。假设您的变量不包含任何需要转义的%-序列。是的,我可能能够避免用命令替换date,但据我所知,不能用命令替换cat。如果我能找到一种方法,在不替换命令的情况下将PID输入日志条目,那么你说的对,我可以绕过整个问题。我喜欢这种思路,但是如果我完全删除cat命令,date命令的存在仍然会触发错误。我喜欢这种思路,但是如果我完全删除cat命令,date命令仍然会触发错误。