【问题标题】:Ubuntu upstart will hang on start/stop/etcUbuntu upstart 将挂在 start/stop/etc
【发布时间】:2013-10-24 09:08:23
【问题描述】:

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

【问题讨论】:

    标签: python ubuntu upstart python-daemon start-stop-daemon


    【解决方案1】:

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

    可能的解决方案 1

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

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

    可能的解决方案 2

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

    注意

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

    【讨论】:

    • 另外注意,我认为最新版本的新贵不再支持 chdir。您还应该删除该节并改用完整的文件路径。
    • 不需要重启,事实上如果新贵在尝试时再次挂起可能会有害,只需按照askubuntu.com/questions/319199/…中列出的PID-rollover配方即可
    【解决方案2】:

    确实如此。 见http://upstart.ubuntu.com/cookbook/#id160

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

    【讨论】:

      猜你喜欢
      • 2012-03-17
      • 1970-01-01
      • 2014-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-11
      • 1970-01-01
      • 2012-06-23
      相关资源
      最近更新 更多