程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

教你如何在 Windows 下讓崩潰的 Python 程序自重啟

編輯: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程序自動運行,遇到報錯自動重啟的配置:

[program:cancel]
command=G:\\Anaconda3\\envs\\tdx_easytrader\\python.exe D://CODE//tdx_easytrader//dataserver.py
    
[supervisord]
nodaemon=true
[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 的絕對路徑。啟動完畢顯示:

2022-06-27 19:58:54,809 INFO process group added: 'cancel'
2022-06-27 19:58:54,810 INFO supervisord started with pid 28472
2022-06-27 19:58:54,815 INFO Spawned: 'cancel' with pid 27220
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。我們在任務管理器中可以查看到這兩個進程:

3.測試

接下來我們測試一下它能否自動重啟,讓我們強殺 27220 這個進程,觀察終端輸出:

2022-06-27 19:58:54,815 INFO Spawned: 'cancel' with pid 27220
2022-06-27 19:58:55,830 INFO success: cancel entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2022-06-27 20:02:58,077 INFO exited: cancel (exit status 1; not expected)
2022-06-27 20:02:58,590 INFO Spawned: 'cancel' with pid 16640
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:

測試成功,程序成功自重啟。

Supervisor不僅會把日志輸出到終端中,在你運行命令的目錄中,它還會生成supervisord.log, 這裡面也保存了所有運行日志:

當然,在上方我們supervisord的配置裡,你也能配置日志輸出位置、最大大小、分片數量等:

[supervisord]
logfile = /tmp/supervisord.log
logfile_maxbytes = 50MB
logfile_backups=10
loglevel = info
pidfile = /tmp/supervisord.pid

Supervisord 還有許多其他的功能,有興趣的同學可以訪問他們官網查詢:

http://supervisord.org/introduction.html

我們的文章到此就結束啦,如果你喜歡今天的Python 實戰教程,請持續關注Python實用寶典。

有任何問題,可以在公眾號後台回復:加群,回答相應紅字驗證信息,進入互助群詢問。

原創不易,希望你能在下面點個贊和在看支持我繼續創作,謝謝!

點擊下方閱讀原文可獲得更好的閱讀體驗

Python實用寶典 (pythondict.com)
不只是一個寶典
歡迎關注公眾號:Python實用寶典


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved