Ubuntu upstart将挂起/

2024-05-02 20:32:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Ubuntu上有几个服务将开始使用“upstart”。它们按请求工作,但当我使用“stop/start/restart{myservice}”时,它将挂起(但将按请求执行)。

我知道这和叉子有关。

我的服务是python脚本,它将在启动时创建新线程。一个脚本将创建1个新线程(并将继续在主线程上运行),第二个脚本将创建2个新线程并将继续在主线程上运行,第三个脚本将不创建新线程。

他们都听从指挥。

在/etc/init中使用相同的代码,如下所示:

description "my service"
version "1.0"
author "my name, 2013"

expect fork

start on runlevel [2345]
stop on runlevel [!2345]
respawn


chdir <to script dir>

exec /usr/bin/python ./scriptname/

你觉得问题出在哪里?“fork”与创建新线程有关系吗?


Tags: 脚本onubuntumyservice叉子fork线程
2条回答

我认为你把用python创建线程和linux分叉混淆了。Python将在运行时管理自己的线程(假设您使用的是常规构造),从upstarts视图来看,它只监视已经启动的正在运行的Python进程-Python应该设置为管理自己的子进程。

可能的解决方案1

尝试完全删除expect子句,然后重新启动(必须重新启动,因为upstart可能正在跟踪不存在的PID)。

当upstart由于一个不正确的expect而跟踪一个不存在的PID时,我看到这个启动/停止挂起,这是通过删除expect并重新启动来解决的。您可以通过执行status myservice来诊断此问题,upstart将报告停止以及一个PID。(对于不能重新启动的其他用户,您也可以使用this script

可能的解决方案2

使用exec su root -c "/usr/bin/python ./scriptname/"设置用户(或某些其他用户)可以解决python/程序试图访问仅存在于certian用户的环境变量时的问题(upstart在默认情况下具有非常少的环境变量集)

您应该尝试查看输出以帮助调试。在现实生活中,您可以通过管道连接到logger,但是将脚本修改为类似/usr/bin/python ./scriptname/ >> /home/myuser/output.log 2>&1的内容将有助于您现在查看内容。

是的。 见http://upstart.ubuntu.com/cookbook/#id160

取决于你的应用程序是使用fork还是使用fork两次或根本不使用,你需要分别使用expect fork、expect deamon或nothing。

相关问题 更多 >