为什么我的 upstart 服务没有在系统启动时启动?

为什么我的 upstart 服务没有在系统启动时启动?

这个问题,我写了一个简单的 upstart 服务(/etc/init/pms.conf)适用于我的无头式 Ubuntu Server 11.04 框,如下所示:

start on filesystem and net-device-up IFACE=eth0
stop on runlevel [016]
respawn

exec /home/administrator/pms-current/PMS.sh

我可以从命令行随意启动(或停止)此服务:

service pms start

我可以看到它确实正在运行。

但是,当我第一次启动我的机器时,服务没有启动。如果我通过 SSH 进入机器并检查服务状态,我会得到:

$ service pms status
pms stop/waiting

我的问题是为什么会发生这种情况?为什么我的服务没有在启动时启动?

更新 1:不确定我的服务是否已启动并随后终止或根本没有启动,我在 PMS.sh 中添加了以下内容:

echo "STARTED" > $STARTLOG

这显然只是给了我某物寻找。我通过自己启动服务然后检查来测试这一点启动日志。然后我删除了启动日志然后重新启动。重启后它就不存在了,所以看起来 upstart 肯定没有启动我的服务。我想它可能在这个过程的早期阶段就死了,但考虑到这一切的简单性,这似乎不太可能。

更新2:我刚刚升级到 11.10,其中包括 upstart 升级,但这个问题仍然出现。

更新 3:根据要求,我已经使用 启动--debug。cat 的输出/var/log/syslog | grep init太长,无法放在问题中,但您可以查看它这里

更新 4:更多日志,这次 upstart conf 包含在顶部。运行 1运行 2

答案1

我建议增加作业的详细程度,例如通过使用启动前/启动后条目。

pre-start script
  logger "pre-start for myprog"
end script

post-start script
  logger "post-start for myprog"
end script

# and for PMS itself:
script
  logger "just before executing PMS"
  exec /home/administrator/pms-current/PMS.sh
end script

更多信息请访问http://upstart.ubuntu.com/cookbook/

另请参阅http://upstart.ubuntu.com/wiki/Debugging

答案2

这里可能发生的情况是,pms 在您的网络适配器启动之前启动,甚至可能在环回适配器 (lo) 启动之前启动。假设我们谈论的是 PS3 媒体服务器,它是一种联网服务,它可能不喜欢在没有可用接口的情况下启动。

尝试将你的起始标准改为:

start on filesystem and net-device-up IFACE!=lo

意思是,在任何“真实”网络接口启动后启动。但是,这可能并不理想,如果 eth0 是下一个启动的接口,PMS 会启动,但您确实希望 PMS 使用 wlan0,那么这样做不行。服务将启动,但可能无法选择您希望它监听的接口。假设您知道要通过哪个接口进行流式传输并且它不会改变,我会将其硬编码到作业中,例如:

start on filesystem and net-device-up IFACE=wlan0

在 Oneiric (11.10) 上,您可以使用事件static-network-up等待所有静态配置的设备。这很好,因为它允许您编写依赖于网络的作业,而无需对接口进行硬编码。[注意:我说的“所有静态配置的设备”是指使用/etc/network/interfaces而不是 NetworkManager。它并不意味着静态 IP 与 DHCP 意义上的静态。]

答案3

通过检查您的系统日志,pms 进程启动时没有错误,但是过了一会儿,它的目标从启动变为停止,这意味着它被终止了。

这有点奇怪,因为你添加了 respawn 子句,所以它应该在停止后尝试重新启动,但它从来没有这样做过。所以我猜你删除了 respawn 子句。

在 pms 服务启动和停止之间,仅启动了 2 个服务 ufw 和网络接口(eth0),并启动了 1 个服务 udev-fallback-graphics。

start on ...看来您的进程 pms 正在并行启动。遗憾的是,upstart 文档对于vanilla 和start on starting ...之间的确切区别有些模糊start on started ...

尝试将启动节更改为

start on started networking

或者只是

start on net-device-up IFACE=eth0

日志输出有点奇怪,因为 net-device-up 事件发生得晚得多,但 pms 在它之前就启动了。

这可以确保你的进程只启动一次全部网络设置已完成,即工作不仅已经开始,而且已经完成。

另外,不要完全信任日志输出,在启动过程的早期,将输出记录到任何文件并不总是有效的。请参阅调试 Upstart

答案4

我遇到了同样的问题,最终我解决了它简单地和:

start on runlevel [2345]

没有任何net-device-upstarted networking东西

这是完整的 upstart 脚本,并且运行完美:

# MyApp

description     "MyApp"
author          "me"

start on runlevel [2345]
stop on runlevel [016]

respawn

exec /usr/bin/myapp 2>> /var/logs/myapp.log

相关内容