继这个问题,我写了一个简单的 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
太长,无法放在问题中,但您可以查看它这里。
答案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
答案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-up
或started 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