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

Ken*_*art 37 server boot upstart

this question之后,我为我的无头Ubuntu Server 11.04框编写了一个简单的新贵服务(/etc/init/pms.conf),如下所示:

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

exec /home/administrator/pms-current/PMS.sh
Run Code Online (Sandbox Code Playgroud)

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

service pms start
Run Code Online (Sandbox Code Playgroud)

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

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

$ service pms status
pms stop/waiting
Run Code Online (Sandbox Code Playgroud)

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

更新 1:不确定我的服务是否正在启动并随后死亡或根本没有启动,我将以下内容添加到 PMS.sh:

echo "STARTED" > $STARTLOG
Run Code Online (Sandbox Code Playgroud)

这显然只是给了我一些寻找的东西。我通过自己启动服务然后检查start.log 来测试这个。然后我删除了start.log并重新启动。重新启动后它不在那里,所以似乎新贵肯定没有启动我的服务。我想它可能会在这个过程的早期死亡,但考虑到这一切的简单性,这似乎不太可能。

更新 2:我刚刚升级到 11.10,其中包括新贵升级,但这个问题仍然存在。

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

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

Cla*_*usi 20

我建议增加工作的详细程度,例如通过使用 pre-start/post-start 条目。

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
Run Code Online (Sandbox Code Playgroud)

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

也看看http://upstart.ubuntu.com/wiki/Debugging


Mar*_*ell 14

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

尝试将您的开始标准更改为:

start on filesystem and net-device-up IFACE!=lo
Run Code Online (Sandbox Code Playgroud)

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

start on filesystem and net-device-up IFACE=wlan0
Run Code Online (Sandbox Code Playgroud)

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

  • 由于您可以在启动后启动它,因此我们必须缺少另一个服务依赖项。一个可能有效(但根本不会照亮我们)的肮脏黑客是在执行 shell 脚本之前,在“预启动脚本”中放入 `sleep 10` - 或更高 - 。 (2认同)