如何判断正在运行的脚本是否崩溃?
我对编程还比较新,主要是自学的,所以如果这个问题有点初级,请见谅。
我有一个Python脚本,它会长时间运行(比如每隔几秒下载一次网页,持续几天)。这有点像是一个监控网页应用的脚本。
不过,偶尔会有一些事情打断它,这时候就需要重启。我已经把这些意外情况减少到最少,但还是会每隔几天发生一次。如果它被杀掉了,而我又没注意到,可能会造成很糟糕的后果。
现在这个脚本是在一个VPS的屏幕会话中运行。
有人能告诉我怎么知道脚本什么时候停止运行,以及如何让它自动重启吗?
这个功能是用Bash写的吗?还是其他什么?我之前从没做过这种事情,不知道从哪里开始,或者该去哪里找信息。
4 个回答
4
你应该把你的程序变成一个守护进程。
正如在高效的Python守护进程中所描述的,你可以安装并使用python-daemon,它实现了PEP 3143中定义的守护进程标准。
你可以创建一个名为mydaemon.py
的文件,内容大致如下:
#!/usr/bin/env python
import daemon
import time
import logging
def do_something():
name = 'mydaemon'
logger = logging.getLogger(name)
handler = logging.FileHandler('/tmp/%s.log' % (name))
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.setLevel(logging.WARNING)
while True:
try:
time.sleep(5)
with open("/tmp/file-does-not-exist", "r") as f:
f.write("The time is now " + time.ctime())
except Exception, ex:
logger.error(ex)
def run():
with daemon.DaemonContext():
do_something()
if __name__ == "__main__":
run()
要实际运行它,你可以使用:
python mydaemon.py
这将会在DaemonContext
中运行do_something()
,然后脚本mydaemon.py
会退出。你可以通过命令pgrep -fl mydaemon.py
来查看正在运行的守护进程。这个简单的例子会把错误记录到/tmp/mydaemon.log
这个日志文件中。你需要手动结束守护进程,否则它会一直运行下去。
如果你想运行自己的程序,只需把try
块中的内容替换成你自己代码的调用即可。
4
你可以试试 supervisord,这是一个用来管理后台进程的工具。
3
我觉得可以写一个包装的bash脚本,让它在一个循环里执行这个python脚本,这样就能解决问题了。
while true; do
# Execute python script here
echo "Web app monitoring script disrupted ... Restarting script."
done
希望这对你有帮助。