Ubuntu的upstart在启动/停止/等待时会挂起

3

我在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'与创建新线程有关吗?
2个回答

10

我认为你正在混淆在Python中创建线程和Linux中的分叉。 Python将在运行时管理其自己的线程(假设您使用常规结构),从起始视图,它只监视您启动的正在运行的Python进程 - Python应设置为管理其自己的子进程。

可能的解决方案1

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

我看到了这种开始/停止挂起情况,当upstart跟踪不存在的PID作为错误expect的结果时,通过删除期望并重新启动来解决。您可以通过执行status myservice进行诊断,并且upstart将报告停止以及PID。(对于其他无法重启的用户,您可以选择使用此脚本

可能的解决方案2

使用exec su root -c "/usr/bin/python ./scriptname/"(或其他用户)设置用户,如果Python /您的程序尝试访问仅存在于某个用户的环境变量,则会解决此问题(默认情况下,upstart仅具有非常少量的环境变量)

注意

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


另外需要注意的是,在最新版本的upstart中,我认为不再支持chdir。您还应该删除该段落并改用完整的文件路径。 - Chris Riddell
不需要重新启动,实际上如果upstart再次挂起尝试可能会有害,只需按照http://askubuntu.com/questions/319199/upstart-tracking-wrong-pid-of-process-not-respawning中列出的PID翻转配方即可。 - Josip Rodin

0

确实是这样。 请参见http://upstart.ubuntu.com/cookbook/#id160

根据您的应用程序是否分叉一次、两次或根本不分叉,您需要使用expect fork、expect deamon或什么也不需要。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接