当前位置: 首页>>技术教程>>正文


为什么我的upstart服务不是从系统启动开始的?

, , ,

问题描述

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 1run 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-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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/1957.html,未经允许,请勿转载。