如何判断正在运行的脚本是否崩溃?

4 投票
4 回答
3022 浏览
提问于 2025-04-17 13:12

我对编程还比较新,主要是自学的,所以如果这个问题有点初级,请见谅。

我有一个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

希望这对你有帮助。

撰写回答