• 教你如何在 Windows 下让崩溃的 Python 程序自重启


    我们用Python定时跑一些自动化程序的时候会出现程序崩溃的情况。此时如果你本人不在电脑面前,或者没有留意到程序的崩溃,没有及时重新拉起程序,会造成或大或小的损失。

    本文将教你如何在 Windows 下使用 Supervisor 重新拉起崩溃的Python程序。

    1.准备

    开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,可以访问这篇文章:超详细Python安装指南 进行安装。

    (可选1) 如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,它内置了Python和pip.

    (可选2) 此外,推荐大家用VSCode编辑器,它有许多的优点:Python 编程的最好搭档—VSCode 详细指南

    请选择以下任一种方式输入命令安装依赖
    1. Windows 环境 打开 Cmd (开始-运行-CMD)。
    2. MacOS 环境 打开 Terminal (command+空格输入Terminal)。
    3. 如果你用的是 VSCode编辑器 或 Pycharm,可以直接使用界面下方的Terminal.

    pip install supervisor-win

    如果你出现 “DLL load failed: 找不到指定的程序” 的报错,请重新安装pywin32:

    pip install pywin32==223

    2.编写自重启配置

    接下来,你需要编写一个让你的Python程序自动运行,遇到报错自动重启的配置:

    1. [program:cancel]
    2. command=G:\\Anaconda3\\envs\\tdx_easytrader\\python.exe D://CODE//tdx_easytrader//dataserver.py
    3.     
    4. [supervisord]
    5. nodaemon=true
    6. [supervisorctl]

    前两行就是你的程序运行命令,在上面的例子中,program: 后面的关键词是你自定义的程序名,我的Python位于: 

    G:\Anaconda3\envs\tdx_easytrader\python.exe

    我想要自重启的脚本位于:

    D://CODE//tdx_easytrader//dataserver.py

    此外,后面的三行是必须配置的,按我的默认写法即可。

    编写完成后将配置命名为 supervisord.conf 保存于任何地方,可以是项目目录下,也可以是一个重要的配置目录文件夹。

    然后执行以下命令启动 supervisord:

    supervisord -c D:\CODE\tdx_easytrader\supervisord.conf

    注意 -c 参数后就是你的 supervisord.conf 的绝对路径。启动完毕显示:

    1. 2022-06-27 19:58:54,809 INFO process group added: 'cancel'
    2. 2022-06-27 19:58:54,810 INFO supervisord started with pid 28472
    3. 2022-06-27 19:58:54,815 INFO Spawned: 'cancel' with pid 27220
    4. 2022-06-27 19:58:55,830 INFO success: cancel entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)

    意思是,supervisord 进程已经启动,pid为28472。我命名为cancel的Python进程也已经启动,pid为27220。我们在任务管理器中可以查看到这两个进程:

    e5c24d18776724be2ec1fb2a09ef373a.png

    3.测试

    接下来我们测试一下它能否自动重启,让我们强杀 27220 这个进程,观察终端输出:

    1. 2022-06-27 19:58:54,815 INFO Spawned: 'cancel' with pid 27220
    2. 2022-06-27 19:58:55,830 INFO success: cancel entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
    3. 2022-06-27 20:02:58,077 INFO exited: cancel (exit status 1; not expected)
    4. 2022-06-27 20:02:58,590 INFO Spawned: 'cancel' with pid 16640
    5. 2022-06-27 20:02:59,603 INFO success: cancel entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)

    可以看到, 20:02:58秒的时候 cancel 程序意外退出(exit status 1; not expected),然后supervisord重新帮我们拉起了一个cancel程序,pid为16640:

    8caa6df4fe60e640b6309320d28d9099.png

    测试成功,程序成功自重启。

    Supervisor不仅会把日志输出到终端中,在你运行命令的目录中,它还会生成supervisord.log, 这里面也保存了所有运行日志:

    09fa9c56e2545924c9e75831de4c9416.png

    当然,在上方我们supervisord的配置里,你也能配置日志输出位置、最大大小、分片数量等:

    1. [supervisord]
    2. logfile = /tmp/supervisord.log
    3. logfile_maxbytes = 50MB
    4. logfile_backups=10
    5. loglevel = info
    6. pidfile = /tmp/supervisord.pid

    Supervisord 还有许多其他的功能,有兴趣的同学可以访问他们官网查询:

    http://supervisord.org/introduction.html

    我们的文章到此就结束啦,如果你喜欢今天的Python 实战教程,请持续关注Python实用宝典。

    有任何问题,可以在公众号后台回复:加群,回答相应红字验证信息,进入互助群询问。

    原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

    点击下方阅读原文可获得更好的阅读体验

    Python实用宝典 (pythondict.com)
    不只是一个宝典
    欢迎关注公众号:Python实用宝典

    5f3bb57262ab2a006809d1a594758263.png

  • 相关阅读:
    二十四节气-白露 | 白露至,秋实美
    JAVA多线程进阶篇-探索线程池ThreadPoolExecutor源码
    python之函数相关知识
    端口映射与容器互联
    FineBI产品简介
    巧用自定义函数,文本控件秒变高速缓存
    java类加载过程
    ASP.NET Core 6框架揭秘实例演示[24]:中间件的多种定义方式
    noip2012Vigenère 密码
    【哈希】关于哈希的实现、冲突的解决、扩容等
  • 原文地址:https://blog.csdn.net/u010751000/article/details/125494664