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