3

我在 Ubuntu 上有几项服务将开始使用“新贵”。他们正在按要求工作,但是当我使用“停止/启动/重新启动 {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' 与创建新线程有什么关系吗?

4

2 回答 2

10

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

可能的解决方案 1

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

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

可能的解决方案 2

如果python /您的程序试图访问仅对特定用户存在的环境变量,则设置用户使用exec su root -c "/usr/bin/python ./scriptname/"(或其他用户)将解决问题(默认情况下,新贵的环境变量集非常少)

笔记

您应该尝试查看输出以帮助您进行调试。在现实生活中,您可能会通过管道将logger脚本修改为类似/usr/bin/python ./scriptname/ >> /home/myuser/output.log 2>&1然后查看内容的内容,这对您现在有帮助。

于 2014-01-22T04:18:21.963 回答
0

确实是的。请参阅http://upstart.ubuntu.com/cookbook/#id160

根据您的应用程序分叉或分叉两次或根本不分叉,您分别需要期望分叉、期望守护程序或什么都不做。

于 2013-12-26T22:40:50.793 回答