所以我对编程有些新意,而且大多是自学成才,很抱歉,如果这个问题在新手方面有点问题。
我有一个长时间运行的python脚本(例如,它每隔几秒就会一次下载几天。)对于一个Web应用程序的监视脚本的排序。
每隔一段时间,就会有一些东西会破坏它,而且需要重新启动。我已经将这些事件发生在最低限度,但它仍然每隔几天就会发生一次,当它确实被杀死时,如果我几小时没有注意到这可能是坏消息。
现在它正在VPS上的屏幕会话中运行。
在知道脚本何时死亡并自动重启时,有人能指出我正确的方向吗?
这会是用Bash写的吗?或者是其他东西?我以前从未做过类似的事情,也不知道从哪里开始,甚至不知道如何寻找信息。
答案 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
块的内容。