如何调试Upstart脚本?


67

由于某些原因,在升级升级过程中出现错误,原因是

% sudo service apport start
start: Job failed to start

在sysvinit下,我可以通过运行例如

sudo sh -x /etc/init.d/whatever start

但这似乎并未映射到Upstart。接下来我应该尝试什么?

事实证明,有一种解决方法可以让安装继续进行。但是我仍然对一个如何跟踪脚本的一般问题感兴趣。


1
我正在做一个更彻底的答复,但是感谢您提供解决方法的链接,今天更新natty时发生了同样的事情!
Mark Russell

哈哈,他们在12分钟前发布了修复程序。运行Beta不好玩吗?(不是!)
Mark Russell

+穆罕默德在下面发布了正确答案。
特拉维斯·里德2014年

我在中找到了有用的调试信息/var/log/syslog
马特

Answers:


29

以下所有信息(以及更多有用的Upstart帮助)都来自The Upstart Cookbook。第18节介绍调试。 http://upstart.ubuntu.com/cookbook/#debugging

在跟踪Upstart作业的“ script”节的这种特定情况下,您应该在单词“ script”的正下方添加以下几行:

exec 2>>/dev/.initramfs/myjob.log
set -x

出现奇数位置的原因是/dev/.initramfs/在加载根文件系统之前的很早的引导中就可用,并且在引导后仍然可用。我猜想带有分界线,但是,您可能不需要使用该路径。不过,很高兴知道该选项。

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

我强烈建议为从事Upstart工作的任何人参考上面链接的Upstart Cookbook。


谢谢,如果我没有发现错误已解决,我可能会set -x按照您的建议修改脚本以使其打开。我主要是想知道是否有更清洁的方法来做到这一点。
poolie 2011年

是的,我所不知道的(如果不在菜谱中,那可能就意味着没有)。除了这个想法外,提到的大多数调试技术都更多地涉及对Upstart和Upstart事件本身进行故障排除,这是我通常会发现的地方。:)
马克·罗素

然而这种方法将失败setuid,并setgid在工作中使用。
0xC0000022L15年

/dev/.initramfs并不总是存在。我刚遇到一台没有此路径的机器。
萨尔赫·博尔希

110

Upstart将您的服务执行记录在中具有相同名称的日志文件中/var/log/upstart/your-service-name.log。应该会有所帮助。


2
是的,看起来这包括工作的标准,所以如果我打开set -x它,它可能会出现在这里。
poolie

1
我在/etc/init.d/Xservice脚本中放入了一个基于echo的日志语句,但是它没有显示在该位置!操作系统:Ubuntu 14.04 Trusty
Champ

为什么不进行syslog?我可以建议一个一般的功能,也许是rsyslog本身,它是暴发户和任何组件(如果不可用)将用于写入syslog的功能,或写入将被尽快转移到syslog的临时位置的功能。我花了半天的时间找到了这个。请转发此评论TIA。
帕普

4
在16.04中似乎不再是这样,至少从15.10起似乎很明显:该目录中的最后一个文件的日期是从15.10版本开始的。
FGM 2016年

1
@FGM这是因为16.04不再使用新贵,而是使用systemd。使用journalctl
Jeremy
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.