为什么在 Upstart 中采购后测试文件会失败?

为什么在 Upstart 中采购后测试文件会失败?

下面的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 ]

该文件永远不会消失。第二个文件测试行是相同的;我甚至尝试过两个都复制/粘贴并手动输入以确保正确。发生了什么?

答案1

我从来没有使用过 upstart,所以这可能不是全部内容。

尝试将其添加true到预启动脚本的末尾,就像script文件中的其他脚本一样。

/etc/default/grub存在时,您的[命令(与 相同test)将返回非零退出状态,即“假”值。这会使包含 和该&&行其余部分的整个命令为假,因此正如预期的那样,右侧不会运行,但这是预启动脚本中的最后一个命令,upstart 可能会将最后一个命令中的非零退出状态视为失败。

相关内容