【问题标题】:What is neccesary to daemonize a python script?守护python脚本需要什么?
【发布时间】:2019-11-15 21:19:00
【问题描述】:

我有一个 python 脚本需要在启动时作为守护程序运行。进程与 tty(和 pdb)分离,但代码没有运行。

我已经把它缩小到一个最小的例子

import daemon
from time import sleep
f1 = open('out.txt','a')
with daemon.DaemonContext():
   while(1):
       f1.write('this is a test')
       sleep(5)

我希望脚本继续运行并每 5 秒向 out.txt 添加一行,但脚本只是从 tty(或 pdb)中分离出来,并且 ps -ax 显示 python 解释器不再运行。 out.txt 已创建,但保持为空

【问题讨论】:

  • 我认为更好的方法是使用supervisordexecute the script 而不是使用守护程序模块
  • 您可能需要考虑使用 systemd。看看例如stackoverflow.com/questions/13069634/…
  • 您的操作系统已经为您提供了将脚本作为守护进程运行的能力——很可能是 sysv、upstart 或 systemd 之一。没必要自己写妖魔化。
  • @p0te: it doesn't print to the file 因为它被缓冲了。将f1.flush() 放在f1.write ... 之后即可立即查看文件内容。
  • @p0te: FWIW, Here 是如何使用 rc.d 的一个简单示例。

标签: python freebsd python-daemon


【解决方案1】:

您可能想使用process supervisor

要简化流程并拥有不依赖于例如systemd(仅限Linux)的可移植解决方案,您可以安装例如immortal,在FreeBSD 中只需要这样做:

pkg install immortal

然后创建一个your-script.yml,如下所示:

cmd: sleep 3

并使用以下命令对其进行守护:

$ immortal -c test.yml

要检查状态,您可以使用immortalctl

$ immortalctl    
  PID     Up   Down   Name      CMD
29993   0.0s          test   sleep 3

如果想在重新启动时始终启动它,只需将您的脚本(在 FreeBSD 中)移动到 /usr/local/etc/immortal/your-script.yml,查看有关 immortaldir 的更多信息

您可以为示例添加更多选项:

cmd: iostat 3
log:
    file: /tmp/iostat.log
    age: 10  # seconds
    num: 7   # int
    size: 1  # MegaBytes
require_cmd: test -f /tmp/foo

更多示例请查看:https://immortal.run/post/run.yml/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 2014-03-04
    • 2010-09-12
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多