2012-02-18 127 views
4

所以我对编程有点新,大多是自学的,所以很抱歉,如果这个问题有点新手。如何知道正在运行的脚本是否死亡?

我有一段长时间运行的python脚本(例如,它每隔几秒就会每隔几秒就下载一次页面)。为web应用程序分配一个监视脚本。

每隔一段时间,一些东西都会中断它,并且需要重新启动。我已经将这些事件减少到了最低限度,但是它每隔几天就会发生一次,当它发生死亡时,如果我没有注意到几个小时,这可能是个坏消息。

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

只要知道脚本何时死亡/并让它自动重启,谁能指出我正确的方向?

这是写在Bash的东西吗?或者是其他东西?我从来没有做过像这样的事情,也不知道从哪里开始或者甚至是寻找信息。

+0

你应该在你的代码中这样做。为什么会死? – Blender 2012-02-18 07:49:00

+0

您可能还想要放入监视挂钩 - 使其触摸临时文件或每隔几秒生成一些日志输出;那么你可以很容易地设置一个单独的看门狗(即使在不同的主机上)。 – tripleee 2012-02-18 13:14:36

回答

3

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

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

希望这会有所帮助。

+1

最好[守护进程](http://stackoverflow.com/a/9346830/462302)脚本并正确处理内部的异常(至少要记录它们)。 – aculich 2012-02-19 04:54:37

2

这取决于您要防范的失败类型。如果它只是剧本崩溃,做最简单的事情是将包装你的主要功能在try /除外:

import logging as log 

while True: 
    try: 
     main() 
    except: 
     log.exception("main() crashed") 

如果事情是杀害Python的过程中,它可能是最简单的在一个shell中运行它循环:

while sleep 1; do python checker.py; done 

如果它是因为机器正在关闭而崩溃......那么......请问您的问题?

然而,直接回答你的问题:绝对的最简单的方法来检查它是否从壳体会到grep的ps输出:

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

当然,这不是防呆,但它通常是很好的。

4

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

2

您应该守护程序。

Efficient Python Daemon描述,您可以安装和使用它实现的PEP 3143乖巧守护规范python-daemon,“标准守护进程库”。

创建一个文件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然后脚本mydaemon.py将退出中do_something()。您可以看到正在运行的守护进程:pgrep -fl mydaemon.py。这个简短的例子将简单地将错误记录到/tmp/mydaemon.log中的日志文件。您需要手动杀死守护进程,否则它将无限期地运行。

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

+0

谢谢,这是非常明确的。我根本没有意识到守护进程。 – some1 2012-02-29 02:52:26

相关问题