以下 Upstart 脚本,另存为/etc/init/upstart-test.conf
作品:
start on filesystem
stop on on runlevel [!2345]
pre-start script
set -x
[ ! -f /etc/default/grub ] && { stop; exit 0; }
. /etc/default/grub
# [ ! -f /etc/default/grub ] && { stop; exit 0; }
end script
script
set -x
. /etc/default/grub
true
end script
启动它(在 Ubuntu 14.04.5 下):
$ sudo initctl start upstart-test
upstart-test start/running, process 2380
如果我取消注释第二个文件存在测试,则作业失败:
$ sudo initctl start upstart-test
initctl: Job failed to start
为什么?日志显示:
$ sudo cat /var/log/upstart/upstart-test.log
+ [ ! -f /etc/default/grub ]
+ . /etc/default/grub
+ GRUB_DEFAULT=0
+ GRUB_TIMEOUT=0
+ GRUB_TIMEOUT_STYLE=hidden
+ GRUB_RECORDFAIL_TIMEOUT=0
+ lsb_release -i -s
+ GRUB_DISTRIBUTOR=Ubuntu
+ GRUB_CMDLINE_LINUX_DEFAULT=
+ GRUB_CMDLINE_LINUX=
+ GRUB_GFXMODE=auto
+ [ ! -f /etc/default/grub ]
该文件永远不会消失。第二个文件测试行相同;我什至尝试复制/粘贴它并手动输入它以确保。这是怎么回事?
我从来没有使用过暴发户,所以这可能不是全部。
尝试添加
true
到预启动脚本的末尾,就像script
文件中的另一个一样。当
/etc/default/grub
存在时,您的[
命令(与 相同test
)返回非零退出状态,这是一个“假”值。这使得整个命令&&
以及该行的其余部分为假,因此如预期的那样,右侧不会运行,但这是预启动脚本中的最后一个命令,并且 upstart 可能会看到非零退出最后一个命令中的状态为失败。