Pedro Asked: 2020-03-19 15:47:22 +0800 CST 2020-03-19 15:47:22 +0800 CST 2020-03-19 15:47:22 +0800 CST 崩溃时在python中自动启动程序 772 我有一个在 Ubuntu16 上运行的 Python 2.7 程序。该程序设计用于在后台捕获推文数月。问题是每周左右,其中一个库中都会出现错误,并且程序会在没有警告的情况下停止工作。 我需要一个解决方案,一旦它崩溃并退出,它将重新启动 python 程序。有没有人有办法解决吗?谢谢 python 1 Answers Voted Best Answer FJSevilla 2020-03-20T01:43:55+08:002020-03-20T01:43:55+08:00 首先,如果脚本以您可以捕获的异常结束,正常情况是您处理所述异常,以便进程本身管理自己,当发生故障时,它会重新初始化所有必要的东西能够继续。 Python允许对异常进行很好的处理,如果您事先知道可能会发生无法纠正的异常,而不是让您的进程突然终止,最好捕获所述异常并以您的受控方式终止工作正在(或重新启动)安全地执行进程(关闭文件或打开套接字,线程的受控终止等)。 一个非常简单的例子来说明我的意思是: #!/usr/bin/env python import time def main(): time.sleep(10) raise RuntimeError() if __name__ == "__main__": while True: try: main() except RuntimeError: print("[WARNING]: script execution fail.") continue break 如果在执行main()类型异常期间发生RuntimeError(在这种情况下,它总是在被调用后的 10 秒内发生),它会被再次调用,无限期地重复该过程。如果它正确结束或由于另一个异常(例如Ctrl+ c),则该过程结束。 如果这是不可能的,你有几个选择: 使用Systemd 守护进程管理器——如果我没记错的话,它是从 15.04 开始内置到系统中的。除了允许您手动初始化服务并在出现故障时自动重新启动它之外,您还可以使其在系统启动时启动。基本思想是创建一个新的 .service 文件: $ sudo touch /etc/systemd/system/twitterBot.service $ sudo chmod 664 /etc/systemd/system/twitterBot.service $ sudo nano /etc/systemd/system/twitterBot.service 基本文件的内容可以是: [Unit] Description=Python Twitter monitor After=network.target After=systemd-user-sessions.service After=network-online.target [Service] ExecStart=/ruta/a/tu/script.py Restart=on-failure [Install] WantedBy=multi-user.target 编辑.service我们保存并重新加载: $ systemctl daemon-reload 有了这个,我们可以随时启动我们的服务: $ sudo systemctl start twitterBot 停止它: $ sudo systemctl stop twitterBot 使其在系统启动时执行: $ sudo systemctl enable twitterBot.service 禁用它以在系统启动时执行: $ sudo systemctl disable twitterBot.service 获取服务信息: $ sudo systemctl status twitterBot.service 这只是一个基本示例,systemd 具有更大的潜力,在上一个链接中您有文档。 重要提示:不要忘记授予脚本执行权限,并确保在脚本开头有正确的 shebang 行指向正确的解释器(例如#!/usr/bin/env python2)。 用于cron安排每 x 次检查进程是否仍在运行的任务,如果没有,则重新启动它。 使用第二个Python 或 bash脚本启动线程,如果它没有按预期完成,则再次启动它。基本的想法是这样的: import subprocess path = "ruta/a/tu/script.py" while True: try: subprocess.check_call(["python2", path]) except subprocess.CalledProcessError: continue 当然还有更多的想法,比如@Gytree 评论,使用脚本而不是 cron 来检查进程是否每 x 次运行一次。但是,在我看来,第一件事是让脚本自行处理其异常(而不是在它发生时突然结束)和其他所有事情(例如,进程因计算机意外关闭而结束) Systemd 是一个工具很好。
首先,如果脚本以您可以捕获的异常结束,正常情况是您处理所述异常,以便进程本身管理自己,当发生故障时,它会重新初始化所有必要的东西能够继续。
Python允许对异常进行很好的处理,如果您事先知道可能会发生无法纠正的异常,而不是让您的进程突然终止,最好捕获所述异常并以您的受控方式终止工作正在(或重新启动)安全地执行进程(关闭文件或打开套接字,线程的受控终止等)。
一个非常简单的例子来说明我的意思是:
如果在执行
main()
类型异常期间发生RuntimeError
(在这种情况下,它总是在被调用后的 10 秒内发生),它会被再次调用,无限期地重复该过程。如果它正确结束或由于另一个异常(例如Ctrl+ c),则该过程结束。如果这是不可能的,你有几个选择:
使用Systemd 守护进程管理器——如果我没记错的话,它是从 15.04 开始内置到系统中的。除了允许您手动初始化服务并在出现故障时自动重新启动它之外,您还可以使其在系统启动时启动。基本思想是创建一个新的 .service 文件:
基本文件的内容可以是:
编辑.service我们保存并重新加载:
有了这个,我们可以随时启动我们的服务:
停止它:
使其在系统启动时执行:
禁用它以在系统启动时执行:
获取服务信息:
这只是一个基本示例,systemd 具有更大的潜力,在上一个链接中您有文档。
用于
cron
安排每 x 次检查进程是否仍在运行的任务,如果没有,则重新启动它。使用第二个Python 或 bash脚本启动线程,如果它没有按预期完成,则再次启动它。基本的想法是这样的:
当然还有更多的想法,比如@Gytree 评论,使用脚本而不是 cron 来检查进程是否每 x 次运行一次。但是,在我看来,第一件事是让脚本自行处理其异常(而不是在它发生时突然结束)和其他所有事情(例如,进程因计算机意外关闭而结束) Systemd 是一个工具很好。