如何调试Upstart脚本?

由于某种原因,我在进行apport升级时遇到了一个错误,其原因是
% sudo service apport start
start: Job failed to start

在sysvinit下,我可以通过运行eg来调试这种问题。
sudo sh -x /etc/init.d/whatever start

但是这似乎不适用于Upstart。我接下来应该尝试什么?
事实证明,有一个解决方法可以让安装继续进行。但我仍然对如何追踪脚本的一般问题感兴趣。

1我正在努力回复一个更详细的答复,但是感谢你给我的解决方法链接,今天更新Natty的时候我也遇到了同样的问题! - Mark Russell
哈哈,他们刚刚发布了修复补丁,才过去了12分钟。测试Beta版本真有趣,不是吗?(真的!) - Mark Russell
+Muhammad在下面发布了正确答案。 - Travis Reeder
我在“/var/log/syslog”中找到了有用的调试信息。 - Matt
2个回答

Upstart会将您的服务执行记录在同名的日志文件中,路径为/var/log/upstart/your-service-name.log。这应该会很有帮助。

2对的,看起来这个包括了作业的 stderr,所以如果我打开了 set -x,它很可能会显示在那里。 - poolie
1我在我的/etc/init.d/Xservice脚本中添加了一个基于回声的日志语句,但它没有显示在这个位置!操作系统:Ubuntu 14.04 Trusty - Champ
为什么不使用syslog呢? 我可以建议一个通用的功能,可能是rsyslog本身,供upstart和任何组件在syslog不可用时使用,或者写入到一个临时位置,然后尽快传输到syslog。 我花了半天时间才找到这个。请将这个备注转发出去。谢谢提前帮助。 - Papou
4这在16.04版本似乎不再正确,至少从15.10版本开始就是如此:该目录中的最后文件日期是在15.10版本发布之前。 - FGM
1@FGM 这是因为16.04不再使用upstart,而是使用systemd。日志可以通过journalctl访问。 - Jeremy

以下所有信息(以及更多实用的 Upstart 帮助)均来自The Upstart Cookbook。第 18 节涵盖了调试。 http://upstart.ubuntu.com/cookbook/#debugging 在追踪 Upstart 作业中的“script”段的具体情况下,您应该在单词“script”的下面添加以下几行代码:
exec 2>>/dev/.initramfs/myjob.log
set -x

奇怪的位置是因为在非常早期的引导过程中,/dev/.initramfs/ 是可用的,在根文件系统加载之前,并且在引导后仍然可用。我猜想使用 apport 时,你可能不需要使用那个路径。但是,知道这个选项也是很好的。

还应该注意到,所有脚本都使用 set -e 运行,因此任何失败的命令都将完全退出脚本。这是有道理的,因为以 root 用户身份运行脚本时应该非常小心。

我强烈建议任何与 Upstart 作业相关的人通常都要参考上面链接的 Upstart Cookbook。


谢谢你的回复,如果我没有看到这个问题已经解决了,我可能会按照你的建议修改脚本来打开set -x。我主要是想知道是否有更简洁的方法来实现这个功能。 - poolie
是的,就我所知没有(如果烹饪书里没有,那很可能就没有了)。除了这个想法外,大部分提到的调试技巧更多是关于解决Upstart和Upstart事件本身的问题,而我通常也是在这方面遇到困扰。 :) - Mark Russell
然而,如果作业中使用了setuidsetgid,这种方法将会失败。 - 0xC0000022L
/dev/.initramfs不是总是存在的。我刚刚遇到了一台没有这个路径的机器。 - Display Name