gpt4 book ai didi

Python 守护进程和 systemd 服务

转载 作者:IT老高 更新时间:2023-10-28 21:37:39 25 4
gpt4 key购买 nike

我有一个作为守护进程工作的简单 Python 脚本。我正在尝试创建 systemd 脚本以便能够在启动期间启动此脚本。

当前 systemd 脚本:

[Unit]
Description=Text
After=syslog.target

[Service]
Type=forking
User=node
Group=node
WorkingDirectory=/home/node/Node/
PIDFile=/var/run/zebra.pid
ExecStart=/home/node/Node/node.py

[Install]
WantedBy=multi-user.target

node.py:

if __name__ == '__main__':
with daemon.DaemonContext():
check = Node()
check.run()

run 包含 while True 循环。

我尝试使用 systemctl start zebra-node.service 运行此服务。不幸的是,服务从未完成说明序列 - 我必须按 Ctrl+C。脚本正在运行,但状态为激活,一段时间后变为停用。现在我正在使用 python-daemon (但在我尝试不使用它并且症状相似之前)。

我应该为我的脚本实现一些附加功能还是 systemd 文件不正确?

最佳答案

它没有完成启动序列的原因是,对于类型 forking,您的启动过程预计会 fork 并退出(请参阅 $ man systemd.service - search for forking)。

只使用主进程,不要守护进程

一种选择是少做。使用 systemd,通常不需要创建守护进程,您可以直接运行代码而无需守护进程。

#!/usr/bin/python -u
from somewhere import Node
check = Node()
check.run()

这允许使用称为 simple 的更简单的服务类型,因此您的单元文件看起来像。

[Unit]
Description=Simplified simple zebra service
After=syslog.target

[Service]
Type=simple
User=node
Group=node
WorkingDirectory=/home/node/Node/
ExecStart=/home/node/Node/node.py
StandardOutput=syslog
StandardError=syslog

[Install]
WantedBy=multi-user.target

请注意,python shebang 中的 -u 不是必需的,但是如果您将某些内容打印到 stdout 或 stderr,则 -u 确保存在没有适当的输出缓冲,打印的行将立即被 systemd 捕获并记录在日志中。没有它,它会出现一些延迟。

为此,我在单元文件中添加了 StandardOutput=syslogStandardError=syslog 行。如果您不关心日记中的打印输出,请不要关心这些行(它们不必存在)。

systemd 使守护进程过时

虽然您的问题的标题明确询问了守护进程,但我猜,问题的核心是“如何让我的服务运行”,而 使用主进程似乎要简单得多(您不需要必须关心守护进程),它可以被视为您问题的答案。

我认为,很多人使用守护进程只是因为“每个人都这样做”。使用 systemd 守护进程的原因通常是过时的。使用守护进程可能有一些原因,但现在很少见。

编辑:将 python -p 固定为正确的 python -u。谢谢kmftzg

关于Python 守护进程和 systemd 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13069634/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com