在2019年用Python编写守护程序的正确方法

时间:2019-03-11 14:27:10

标签: python linux daemon systemd

TL; DR;

我想用Python编写一个守护进程,但是由于几乎每个人都使用systemd,我觉得PEP 3143太过强大了。我正在寻找有关以Python编写守护程序的良好开端的建议。

上下文

通过阅读有关SO的其他相关问题,似乎在systemd之前和之后。我读过的文章已有10多年的历史了,我觉得如今实现我想要做的事情要容易得多。

我想编写一个可以运行的程序容器:

  • 在前面(阻止)($ ./foo
  • 在后台($ ./foo &
  • 处于分离状态($ ./foo start$ ./foo stop)。
  • systemd$ sudo systemctl start foo)管理

要能够独自startstop执行该程序,将需要以下命令:

$ daemon start
$ daemon stop
$ daemon status

此外,如果程序能够自我妖化,它还将解决一些副作用(防止僵尸,双叉,pidfile,日志记录...)

我还没有弄清楚如何管理日志。由于守护程序已与TTY分离,因此应将stdinstdoutstderr重定向到/dev/null并使用记录器。要使用记录器,我可以看到不同的选项:

  1. 使用Syslog,但需要对/dev/log的写访问权限
  2. 使用daemon.logstdoutsystemd,但需要systemd
  3. 使用将由--log=~/foo.log指定的自定义日志文件
  4. 使用stdout / stderr,因为该过程未分离

对于PID文件,传统位置在/var/run/中,大多数用户无法访问该位置。因此,用户应该能够配置--pidfile

由此,我意识到构建一个简单的守护程序并非易事,而且我不知道从哪里开始。

一种简单的方法是拥有两个单独的程序。一个执行任务的简单阻塞程序使用stdout,一个过程管理器可以执行systemd,但是在用户级别。

如果我用一句话概括我的问题,我会说:

  

是否值得在2019年使用PEP3143 Standard daemon process library用Python编写守护程序,而不是依赖于systemd之类的守护程序管理器?

0 个答案:

没有答案