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

继这个问题之后 ,我为无头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并重新启动。 重新启动后它不在那里,所以似乎upstart肯定没有启动我的服务。 我想它可能会在此过程的早期阶段死亡,但鉴于这一切的简单性,这似乎不太可能。

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

更新3 :根据要求,我用--debug启动了。 cat /var/log/syslog | grep init的输出 /var/log/syslog | grep init太长了,不能放在问题中,但你在这里查看它。

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

我建议增加工作的详细程度,例如使用开始前/开始后的条目。

 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 

意思是,在任何“真正的”网络接口启动后启动。 然而,这可能不是理想的,如果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的静态。]

从检查你的系统日志开始,pms进程从没有错误开始,但过了一会儿,它的目标从开始变为停止意味着它被杀死。

这有点奇怪,因为你已经添加了repsawn子句,所以它应该在它被停止后再尝试重新开始,但它永远不会。 所以我猜你删除了respawn子句。

在pms服务启动和停止之间只有2个服务启动ufw和network-interface(eth0),1启动udev-fallback-graphics。

似乎您正在并行启动进程pms。 不幸的是,新手文档对于start on ...香草和start on starting ...之间的确切差异有点朦胧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 

我在RHCSA / CE培训期间遇到过chkconfig

 sudo apt-get install chkconfig sudo chkconfig pms on 

您可以查看它的Oneiric 手册页 ,了解有关它的function的更多详细信息。

我找到了解决方案,但我不明白。 如果我将PMS从/home/administrator移到/bin/pms并将root作为所有者,那么一切正常。

如果我将它保留在/home/administrator/但确保root是/home/administrator/目录本身的所有者的所有者,它仍然不起作用。

如果我将管理员设置为所有内容的所有者,并将我的脚本的相关部分更改为:

 sudo su administrator -c '/home/administrator/pms-current/PMS.sh' 

它仍然无法正常工作。

我想现在我将创建一个/home/root/目录并移动所有内容,但我真的想完全理解这一点。

当我意识到我的脚本依赖于我家中的文件时,我有一个类似的“无法启动”问题,并且由于使用标准的ubuntu机制(.Private)加密了,因此无法访问该主页。

在解密过程结束之前(可能)发出start on local-filesystems事件。

NFS上的主目录是? 有时root无法访问NFS。

为了记录,我刚刚在12.04进行了一次小测试:

  • start on started networkingstart on network-interface-up INTERFACE=eth0不起作用,但是

  • start on started network-interface INTERFACE=eth0

感谢http://os4.org/wiki/upstart.html指出initctl list 始终将作业网络显示为已停止。

在我的例子中,upstart服务依赖于vagrant synced文件夹中的脚本。 使用以下行解决了问题:

 start on vagrant-mounted 

更多信息: http : //razius.com/articles/launching-services-after-vagrant-mount/

与@xuhcc类似,我来到这里是为了找出为什么我的Vagrant Upstart脚本没有运行。 以下应该有效:

从流浪汉开始

但由于以下错误,在某些版本中没有。

https://github.com/mitchellh/vagrant/issues/6074

报告中列出的解决方法对我很有用:

 $ cat /etc/init/workaround-vagrant-bug-6074.conf # workaround for https://github.com/mitchellh/vagrant/issues/6074 start on filesystem task env MOUNTPOINT=/vagrant script until mountpoint -q $MOUNTPOINT; do sleep 1; done /sbin/initctl emit --no-wait vagrant-mounted MOUNTPOINT=$MOUNTPOINT end script 

对我来说很棒

它对我有用(我需要在启动后启动服务):

 start on started networking and net-device-up IFACE=wlan1 stop on shutdown respawn respawn limit 10 10