我有一个非常简单的 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