我是 upstart 的新手,我想知道是否有办法告诉 upstart 仅在系统启动时执行特定命令,而不是在随后从命令行重新启动应用程序时执行。例如,我有以下 upstart 配置:
#!upstart
description "Hello World"
author "me"
start on (local-filesystems and net-device-up)
stop on shutdown
script
export HOME="/root"
echo $$ > /var/run/hello-world.pid
exec /usr/local/bin/hello-world
end script
pre-start script
# Date format same as (new Date()).toISOString() for consistency
echo "[`date -u +%Y-%m-%dT%T.%3NZ`] Hello World Starting" >> /var/log/hello-world.sys.log
end script
pre-stop script
rm /var/run/hello-world.pid
echo "[`date -u +%Y-%m-%dT%T.%3NZ`] Hello World Stopping" >> /var/log/hello-world.sys.log
end script
这成功在启动时启动了应用程序。如果我执行:
/sbin/start hello-world
这将再次启动应用程序:我想仅在系统启动时执行特定命令,而不是在应用程序启动时执行,例如:
第一次执行:
- 系统启动
- Upstart 被执行
- 执行特定的系统启动脚本
- 应用程序 hello-world 被执行
第二次执行使用/sbin/start hello-world
:
- 仅执行应用程序而不执行特定的启动脚本
有办法吗?
答案1
我有一个解决方案,但是它太丑陋了。
因此../proc/uptime
包含自启动以来的秒数。
$ cat /proc/uptime
350735.47 234388.90
第一个数字是开启秒数,第二个数字是空闲秒数。
所以..
$UPTIME=$(cut -f1 -d' '< /proc/uptime)
if [ $UPTIME -le 300 ] then
/start/pre-run/script.sh
fi
如果系统刚刚启动(或 300 秒内未运行),则将运行预运行脚本。您可以将 300 秒调低至系统准备就绪的实际时间。
虽然很脏,但值得一试,对吧?
答案2
使用下面的‘cookie 文件’ /var/run
*。仅当 cookie 文件不存在时才执行特定的启动脚本,并在成功执行后创建它。
Files under this directory must be cleared (removed or truncated as appropriate) at the beginning of the boot process.