Python 如何知道正在运行的脚本是否死亡?

Python 如何知道正在运行的脚本是否死亡?,python,bash,process,daemon,Python,Bash,Process,Daemon,所以我对编程有点陌生,大部分是自学的,如果这个问题有点新手的话,我很抱歉 我有一个长时间运行的python脚本(例如,它每几秒钟下载一次页面,持续几天。)类似于web应用程序的监控脚本 每隔一段时间,就会有什么东西扰乱它,它需要重新启动。我已经把这些事件降到了最低限度,但它仍然每隔几天发生一次,当它真的被杀死时,如果我几个小时都没有注意到,那可能是个坏消息 现在它正在VPS上的屏幕会话中运行 有没有人能给我指出正确的方向,让我知道脚本何时死亡/并让它自动重新启动 这是用Bash写的东西吗?还是别

所以我对编程有点陌生,大部分是自学的,如果这个问题有点新手的话,我很抱歉

我有一个长时间运行的python脚本(例如,它每几秒钟下载一次页面,持续几天。)类似于web应用程序的监控脚本

每隔一段时间,就会有什么东西扰乱它,它需要重新启动。我已经把这些事件降到了最低限度,但它仍然每隔几天发生一次,当它真的被杀死时,如果我几个小时都没有注意到,那可能是个坏消息

现在它正在VPS上的屏幕会话中运行

有没有人能给我指出正确的方向,让我知道脚本何时死亡/并让它自动重新启动


这是用Bash写的东西吗?还是别的什么?我以前从未做过类似的事情,不知道从哪里开始,甚至不知道从哪里寻找信息。

这取决于你想要防范的失败类型。如果只是脚本崩溃,最简单的方法是将主函数包装为try/except:

import logging as log

while True:
    try:
        main()
    except:
        log.exception("main() crashed")
如果有什么东西正在扼杀Python进程,那么在shell循环中运行它可能是最简单的:

while sleep 1; do python checker.py; done
如果它崩溃是因为机器坏了…好吧…你认为是什么原因造成的

但是,要直接回答您的问题:检查它是否从shell运行的最简单方法是grep
ps
的输出:

ps | grep "python checker.py" 2>&1 > /dev/null
running=$?

当然,这不是万无一失的,但它通常已经足够好了。

你可以试试,它是一个控制守护进程的工具。

我相信在循环中执行python脚本的包装器bash脚本应该可以做到这一点

while true; do
    # Execute python script here
    echo "Web app monitoring script disrupted ... Restarting script."
done

希望这能有所帮助。

您应该对程序进行后台监控

如中所述,您可以安装并使用,它实现了“标准守护进程进程库”的行为良好的守护进程规范

创建一个包含以下内容的文件
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
中生成
dou_something()
,然后脚本
mydaemon.py
将退出。您可以通过以下命令查看正在运行的守护程序:
pgrep-fl mydaemon.py
。这个简短的示例只是将错误记录到
/tmp/mydaemon.log
中的日志文件中。您需要手动终止守护进程,否则它将无限期运行


要运行您自己的程序,只需将
try
块的内容替换为对代码的调用。

您应该在代码内部执行此操作。为什么它会死掉呢?你可能还想放一个监控钩子——让它接触一个临时文件或每隔几秒钟生成一些日志输出;然后,您可以轻松地设置一个单独的监视程序(即使在不同的主机上)。最好使用脚本并在其中正确地处理异常(至少,记录它们)。谢谢,这非常清楚。我一点也不知道Daemoning。