为什么我的新贵服务无法在系统启动时启动?


37

此问题之后,我为无头的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太长,无法放入问题中,但是您可以在此处查看它。

更新4:更多日志,这次新贵conf位于顶部。运行1运行2


您确定脚本未执行?pms停止/等待消息表示已运行upstart作业,并且所有命令均正常终止。
安排

cat /var/log/syslog | grep init使用Upstart Debugging
Ciaran Liedeman 2011年

@Anarci:请参阅我的问题中的更新3。
肯特·布加亚特

大多数用户不会在此处给出这样的电子邮件地址,而是提供指向Ubuntu
Ciaran Liedeman 2011年

@Anarci:完成-请参阅我的问题。
肯特·布加亚特

Answers:


19

我建议增加工作的详细程度,例如通过使用启动前/启动后条目。

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


这确实是我的主意。我在您的帖子背面尝试了十二种不同的方法。由于日志中出现各种晦涩难懂的消息,所有这些都失败了。我的最新尝试导致了init:pms主进程(1329)终止,状态为143,这对我来说毫无意义。我可以看到PMS.sh甚至没有启动,因为它所做的第一件事是写入自己的日志,并且该日志条目不存在。我可以看到启动前的输出,它告诉我目标文件存在并且可以执行。明天我会再次讨论,但是如果您有任何想法,我很乐意听到。谢谢。
肯特·布加亚特

嗨@KentBoogaart,我似乎也遇到了同样的问题。您找到解决方案了吗?
Daniele B 2014年

@KentBoogaart我和你有同样的问题吗?你有运气吗?
Mevin Babu 2014年

14

此处可能发生的情况是,pms在网络适配器启动之前开始,甚至在回送适配器(lo)之前启动。假设我们正在谈论PS3 Media Server,它是一项网络服务,它可能不喜欢没有可用接口启动。

尝试将准则的开始更改为:

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的意义上,这并不意味着静态。]


这听起来像是把戏,但是没有用。我只有loeth0但是我使用了您的第二个建议:start on filesystem and net-device-up IFACE=eth0。重新启动后仍然无法执行。我刚刚在PMS日志中注意到了一些线索。我将进行调查并返回...
Kent Boogaart 2011年

这真有趣。我没有提到的一件事是,我尝试了您的原始脚本,并且该脚本可以在我的计算机启动时工作。我将其归因于平局的运气(即在我的比赛条件下,好车获胜,而在你的情况下,坏车获胜)。我真的看不到我们在这里还缺少什么依赖。奇怪的。
马克·罗素

2
由于您可以在启动后启动它,因此我们必须缺少另一个服务依赖项。可能有效(但根本无法说明我们)的一个肮脏的技巧是,sleep 10在执行shell脚本之前,先放入一个“或更高版本”的“预启动脚本”。
马克·罗素

抱歉,Mark-但我们在同一页面上。我已经在预启动脚本中尝试过sleep 10事情。不行 然后,我尝试完全删除debug.log并重新启动。引导后,我具有相同的服务状态,并且没有debug.log文件,因此我不相信PMS实际上已经在运行。有一种简单的方法可以诊断此问题吗?如果我更改PMS.sh以吐出一些输出,它将流向何处?我想我总是可以将其定向到我自己的文件中-接下来可以尝试一下。
肯特·布加亚特

我刚刚用更多信息更新了我的问题。
肯特·布加亚特

3

通过检查您的系统日志,pms进程开始没有错误,但是不久之后,其目标从开始更改为停止,这意味着它已被杀死。

这有点奇怪,因为您添加了repsawn子句,因此该子句在停止后应尝试重新启动,但从不执行。所以我猜您删除了respawn子句。

在pms服务启动和停止之间,仅ufw和网络接口(eth0)启动了2个服务,而udev-fallback-graphics启动了1个服务。

看来您正在处理pms正在并行启动。不幸的是,新贵的文档对start on ...Vanilla和start on starting ...和之间的确切区别有些模糊start on started ...

尝试将您的启动节更改为

start on started networking

还是太

start on net-device-up IFACE=eth0

日志输出有些奇怪,因为net-device-up事件要晚得多,但是pms在它之前开始。

这应确保您的过程仅在所有网络设置完成后才开始,即作业不仅已经开始而且已经完成。

也不要完全信任日志输出,在启动过程的早期,将日志输出到任何文件都不总是有效。请参阅调试新贵中的答案


3

设法通过在运行级别上使用start来解决类似问题:

start on runlevel [2345]

3

我有同样的问题,最后我解决了它只是有:

start on runlevel [2345]

没有任何net-device-upstarted networking东西

这是完整的暴发户脚本,它可以完美运行:

# MyApp

description     "MyApp"
author          "me"

start on runlevel [2345]
stop on runlevel [016]

respawn

exec /usr/bin/myapp 2>> /var/logs/myapp.log

1

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

sudo apt-get install chkconfig
sudo chkconfig pms on

您可以在Oneiric 手册页上查看有关其功能的更多详细信息。


1

我已经找到了解决方案,但是我不明白。如果我以所有者/home/administrator/bin/pmsroot 来回移入PMS ,则一切正常。

如果我将其保留在/home/administrator/目录下,但确保root是/home/administrator/目录本身所有内容的所有者,则该目录仍然无效。

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

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

它仍然不起作用。

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


chkconfig还是没用吗?您是否尝试将目录设置PMS.sh为root?如果仅您的解决方案有效,请转到Upstart的Launchpad页面并直接与开发人员联系。
Oxwivi

如果仅移动它就足够了,.sh那么只需将所有内容保留在那里并编辑脚本以指向该目录(甚至更改目录?)即可。
Oxwivi

是的,我尝试将整个PMS目录归root拥有。大概是因为/ home / administrator /不是root用户所有,所以它不起作用。
肯特·布加亚特

无论如何,这没有任何意义,我会定期通过upstart在/ home目录中运行脚本,而不会出现问题,这很奇怪。
安排

甚至陌生人:我只是尝试了/ home / root /下的所有内容,而这显然是root所拥有的。没用 我将所有内容都移回了/ bin / pms下,并且再次起作用。因此,似乎尝试从/ home下启动PMS不适用于我的系统。
肯特·布加亚特

1

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

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


1

您的主目录在NFS上吗?有时,root无法访问NFS。

作为记录,在我现在的12.04小测试中:

  • start on started networking而且start on network-interface-up INTERFACE=eth0 不工作,但是

  • start on started network-interface INTERFACE=eth0 做。

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


引用的链接已损坏。
slm


0

类似于@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

对我来说很棒


0

它为我工作(iface起来后我需要启动服务):

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

respawn
respawn limit 10 10
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.