如何在后台运行 Python 脚本并在崩溃后重新启动它?

如何在后台运行 Python 脚本并在崩溃后重新启动它?

我有一个非常简单的 Python 脚本,我希望它始终在我的 Ubuntu 12.04 服务器上运行。我考虑过使用 upstart + monit。问题是这些工具对于像我这样的普通人来说似乎相当复杂,而且我在网上找不到一个简单的示例。

upstart + monit 是不是有点过了?有人知道更简单的替代方案,或者 upstart + monit 的优秀教程吗?如果我只是想确保脚本始终运行,是否需要 monit?

答案1

最简单的方法是将其放置在/etc/init/something.conf

start on runlevel [2345]
stop on runlevel [016]

respawn
exec python /path/to/your/script.py

如果它被终止或以非零值退出(如未捕获的异常),Respawn 将重新启动它。这将适用于 Ubuntu 10.04。

如果您使用的是 12.04,则可以获得更多功能。以上将以 root 身份运行您的脚本。在 12.04 中,您可以添加 setuid/setgid:

start on runlevel [2345]
stop on runlevel [016]

respawn
setuid nobody
setgid nogroup
exec python /path/to/your/python.py

如果您的脚本在没有可用网络时退出,并且您计划在网络连接不稳定的情况下运行它,那么您应该修复这个问题,让它保持活动状态/重试。但如果不能,您可能还需要在网络设备启动时手动启动它。因此,您可以将其放入/etc/network/if-up.d/yourscript(使用 chmod +x 使其可执行)

#!/bin/sh
exec start wait-for-state WAITER=$IFACE-yourscript WAIT_FOR=something

其中 yourscript 只是这个特定脚本的任意且唯一的内容,“something” 与作业名称相同(例如/etc/init/something.conf之前建议的)。

答案2

过去的常用方法是写入一个包含时间戳或进程 ID 的文件/tmp,然后检查此进程 ID 是否仍在运行,或者时间戳是否仍然是最近的。

您还可以做一个简单的while [ 1 ]; do phyton-script.ph; done操作,以防它返回并重新启动脚本。

如需了解更多可能性,请提供有关脚本的更多信息。尤其是您预计它会意外退出或崩溃的原因。

答案3

我用过systemd

打开文本编辑器并创建一个新的服务文件,例如your_program.service。将文件放在/etc/systemd/system/目录中。

your_programe.service

[Unit]
Description=Your Python Program
After=network.target

[Service]
User=your_username
WorkingDirectory=/path/to/your/python/program/
ExecStart=/usr/bin/python3 your_program.py
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

保存并运行这些命令

sudo systemctl daemon-reload
sudo systemctl start your_program
sudo systemctl enable your_program

你可以看到日志

journalctl -u your_program -f

相关内容