问题描述
继this question之后,我为无头Ubuntu Server 11.04框编写了一个简单的upstart服务(/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
我可以从命令行随意启动(或停止)此服务:
service pms start
我可以看到它确实在运行。
但是,当我第一次启动我的机器时,服务无法启动。如果我在框中SSH并检查服务状态,我得到:
$ service pms status
pms stop/waiting
我的问题是为什么会发生这种情况?为什么我的服务不是在启动时启动的?
更新1:不确定我的服务是否正在启动并随后死亡或者根本没有启动,我将以下内容添加到PMS.sh:
echo "STARTED" > $STARTLOG
这显然只是给了我一些东西。我通过自己启动服务然后检查start.log来测试这个。然后我删除了start.log并重新启动。在重新启动后它不在那里,所以看起来新贵肯定不会启动我的服务。我想它可能会在此过程的早期阶段死亡,但鉴于这一切的简单性,这似乎不太可能。
更新2:我刚刚升级到11.10,其中包括一个新贵升级,但这个问题仍然存在。
更新3:根据要求,我已使用--debug
启动。 cat /var/log/syslog | grep init
的输出太长而无法放入问题中,但您可以将其视为here。
更新4:更多日志,这次upstart conf包含在顶部。 Run 1和run 2。
最佳解决思路
我建议增加工作的详细程度,例如:使用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
更多信息,请访问http://upstart.ubuntu.com/cookbook/
另请看一下http://upstart.ubuntu.com/wiki/Debugging
次佳解决思路
这里可能发生的是pms在网络适配器出现之前启动,甚至可能在环回适配器(lo)之前启动。假设我们正在谈论PS3媒体服务器,它是一个网络服务,它可能不喜欢启动时没有可用的接口。
尝试将标准的开头更改为:
start on filesystem and net-device-up IFACE!=lo
意思是,在任何”real”网络接口启动后启动。但是,这可能不太理想,如果eth0是下一个接口,PMS启动,但你真的希望PMS使用wlan0,这是不行的。该服务将启动,但它可能无法选择您希望它监听的界面。假设你知道你要流过的接口并且它不会改变,我会把它硬编码到工作中,例如:
start on filesystem and net-device-up IFACE=wlan0
在Oneiric(11.10)上,您可以使用事件static-network-up
等待所有静态配置的设备。这很好,因为它允许您编写network-dependent作业而无需对接口进行硬编码。 [注意:通过“所有静态配置的设备”,我指的是使用/etc/network/interfaces
而不是NetworkManager。它并不意味着静态IP与DHCP的静态。]
第三种解决思路
从检查你的系统日志开始,pms进程从没有错误开始,但过了一会儿,它的目标从开始变为停止意味着它被杀死。
这有点奇怪,因为你已经添加了repsawn子句,所以它应该在它被停止后再尝试重新启动,但它永远不会。所以我猜你删除了respawn子句。
在pms服务启动和停止之间,只有2个服务启动ufw和network-interface(eth0),并且1启动udev-fallback-graphics。
似乎您正在并行启动pms。不幸的是,对于start on ...
香草和start on starting ...
与start on started ...
之间的确切差异,新贵文献有点模糊。
尝试将您的启动节更改为
start on started networking
或者也是
start on net-device-up IFACE=eth0
日志输出有点奇怪,因为net-device-up事件发生的时间要晚得多,但pms在它之前启动。
这应确保您的流程仅在所有网络设置完成后才开始,即作业不仅已开始但已完成。
也完全不信任日志输出,在启动过程的早期,日志输出到任何文件并不总是有效。请参阅Debugging Upstart中的答案
第四种思路
通过在运行级别上使用start来管理以解决类似的问题:
start on runlevel [2345]
第五种思路
我遇到了同样的问题,最终我用以下方法解决了这个问题:
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