【问题标题】:Start a Linux daemon from Python从 Python 启动 Linux 守护进程
【发布时间】:2013-01-07 01:31:37
【问题描述】:

快速提问,

我正在使用 Django 中的 python 脚本从网页启动一个 linux 守护程序(动作)。当我使用以下内容时:

def restartRecord():
    #restart the service
    config_file = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'recorder/config/motion.conf')
    p = subprocess.call(['motion', '-c', config_file])
    return True

它启动守护进程没有问题,但如果我使用从 django 开发服务器(端口 8000)运行它,它也会占用端口。这是正常的行为吗? - 为什么启动守护进程会占用那个端口?我可以通过停止开发服务器并尝试重新启动来测试它。

有没有更好的方法来启动这个服务?

干杯, 本

【问题讨论】:

  • 子进程继承文件描述符,其中包括网络连接。适当的守护程序将关闭从父级继承的所有文件描述符。你的守护进程可能不会。

标签: python django linux


【解决方案1】:

p = subprocess.call(['motion', '-c', config_file]) 是一个同步调用,这意味着页面加载将被阻止,直到“motion”退出(或 fork-daemonizes 自身)。

Django 开发服务器是单线程的,因此在等待此请求成功时不会处理任何其他请求。

您可能需要考虑使用 unix start-stop-daemon 实用程序来包装对运动的调用。

【讨论】:

  • 在运动配置中,它被设置为作为守护进程运行。我似乎无法弄清楚如何使用自定义的运动配置文件进行启停,即传递参数。有什么想法吗?
【解决方案2】:

它似乎在 apache 下工作正常,这是主要的。感谢您的回复。

【讨论】: