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

时间:2012-02-18 07:48:10

标签: python bash process daemon

所以我对编程有些新意,而且大多是自学成才,很抱歉,如果这个问题在新手方面有点问题。

我有一个长时间运行的python脚本(例如,它每隔几秒就会一次下载几天。)对于一个Web应用程序的监视脚本的排序。

每隔一段时间,就会有一些东西会破坏它,而且需要重新启动。我已经将这些事件发生在最低限度,但它仍然每隔几天就会发生一次,当它确实被杀死时,如果我几小时没有注意到这可能是坏消息。

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

在知道脚本何时死亡并自动重启时,有人能指出我正确的方向吗?

这会是用Bash写的吗?或者是其他东西?我以前从未做过类似的事情,也不知道从哪里开始,甚至不知道如何寻找信息。

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

我相信在循环中执行python脚本的包装器bash脚本应该可以解决问题。

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

希望这有帮助。

答案 2 :(得分:2)

这取决于你想要防范的失败类型。如果它只是脚本崩溃,最简单的方法是将主函数包装在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

如果它崩溃了,因为机器正在下降......那么...... Quis custodiet ipsos custodes?

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

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

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

答案 3 :(得分:2)

你应该守护你的程序。

Efficient Python Daemon中所述,您可以安装和使用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

哪个会在do_something()中生成DaemonContext,然后脚本mydaemon.py将退出。您可以使用pgrep -fl mydaemon.py查看正在运行的守护程序。这个简短的示例只是将错误记录到/tmp/mydaemon.log中的日志文件中。你需要手动杀死守护进程,否则它将无限期地运行。

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