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


10

我有一个非常简单的Python脚本,希望一直在我的Ubuntu 12.04服务器上运行。我想到了使用upstart + monit。问题在于,对于像我这样的简单凡人,这些工具似乎相当复杂,而我在网上找不到简单的示例。

是暴发户+监工的杀手over吗?有人知道更简单的替代方法,还是新手+监控的好教程?如果我只是想确保脚本始终运行,那么是否需要监视?


作为参考,这里提出了完全相同的问题:superuser.com/q/461546/786969
PHPirate

Answers:


16

最简单的方法是将其放在/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先前建议的名称)。


是的 所以这用upstart对吗?这是否意味着脚本也将在引导时启动(太棒了!)?并且respawn足够您不需要进行设置monit吗?
sebpiq 2012年

是的,“在运行级别启动[2345]”是指系统进入“多用户模式”时。从长远来看,有一个计划形成,以用“开始启动网络服务”和“停止停止网络服务”之类的东西替换非常古老的unixy“运行级别”,以使其更具逻辑性。
SpamapS 2012年

太棒了!非常感谢,这正是我所需要的。
sebpiq 2012年

2

从过去开始,通常的做法是将包含时间戳记或进程ID的文件写入 /tmp,然后检查该进程ID是否仍在运行,或者分别检查时间戳是否是最近的。

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

有关更多可能性,请提供有关脚本的更多信息。特别是关于为什么您期望它意外退出或崩溃的原因。


该脚本只是使用流式API截取来自Twitter的推文。因此,基本上存在一个无限循环,等待推文被推送,执行一些代码并返回等待状态。我只是希望它可以运行而不必担心...如果有错误并且崩溃了,等等...
sebpiq 2012年

类似的回答你(我接受):superuser.com/questions/461546/...
sebpiq

另外,进行cron作业以检查脚本是否仍在运行可能是一个好主意。
con-f-use
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.