gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:08:14 24 4
gpt4 key购买 nike

我在 upstart 中看到一个问题,即在启动后脚本节中使用命令替换会导致错误(系统日志报告“以状态 1 终止”),但仅在初始系统启动期间。

我已经尝试使用几乎所有启动事件 Hook 。 local-filesystems 和 net-device-up 在大约 1/100 次尝试中没有错误,所以它看起来像一个竞争条件。它在手动启动/停止时工作得很好。我看到的触发错误的命令替换是一个简单的猫或日期,我已经尝试使用 $() 方式和反引号方式。我也试过在开始前使用 sleep 来击败比赛条件,但那没有任何作用。

我在带有 Win7 主机的 VMWare 上运行 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

最佳答案

我能想到的最有可能的情况是 $MYAPP_PIDFILE 尚未创建。

因为您没有指定“expect”节,一旦主进程 fork 并执行后启动就会运行。因此,正如您所怀疑的那样,start-stop-daemon 运行节点和编写该 pidfile 以及 /bin/sh fork 、执行和再次 fork 之间可能存在竞争执行 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

值得注意的是,在 Upstart 1.4(首先包含在 Ubuntu 12.04 中)中,upstart 添加了日志记录功能,因此无需将输出重定向到特殊的日志文件中。所有控制台输出默认为 /var/log/upstart/$UPSTART_JOB.log(由 logrotate 轮换)。所以那些回声可能只是纯粹的回声。

关于linux - Upstart:在启动序列期间在启动后脚本节中使用命令替换时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10435179/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com