![](/img/trans.png)
[英]How to restart a DiscordBot Program after it crashes or exits with a error code?
[英]how to restart a python program after it crashes
我有一個 python 腳本,它啟動一個程序並通過它自動化,不斷處理新數據並保存到預設目錄。
永久運行 Python 腳本、在發生錯誤時記錄錯誤並在崩潰時重新啟動的推薦方法是什么?
到目前為止,我遇到了os.execv
並開始:
import sys
import os
def pyexcept(t, v, tb):
import traceback
## restarts the script
os.execv( sys.executable, '')
但是我經常在試圖弄清楚下一步時遇到困難,有人可以解釋我可以采取的下一步嗎,ty!
當 python 腳本崩潰時,程序不再運行,因此腳本無法執行更多行代碼。
您有 2 個選項:
我假設您是 python 的新手,所以這里有一個 python 腳本的示例,該腳本處理異常,再次調用相同的 function。
from time import sleep
def run_forever():
try:
# Create infinite loop to simulate whatever is running
# in your program
while True:
print("Hello!")
sleep(10)
# Simulate an exception which would crash your program
# if you don't handle it!
raise Exception("Error simulated!")
except Exception:
print("Something crashed your program. Let's restart it")
run_forever() # Careful.. recursive behavior
# Recommended to do this instead
handle_exception()
def handle_exception():
# code here
pass
run_forever()
這是通過命令python test.py
啟動另一個名為“test.py”的 python 腳本的腳本。 確保你有正確的文件路徑,如果你把腳本放在同一個文件夾中,你通常不需要完整路徑,只需要腳本名稱。
值得注意的是,確保您的系統可以識別命令“ python ”,在某些情況下它可以被“python3”識別
script_starter.py
from subprocess import run
from time import sleep
# Path and name to the script you are trying to start
file_path = "test.py"
restart_timer = 2
def start_script():
try:
# Make sure 'python' command is available
run("python "+file_path, check=True)
except:
# Script crashed, lets restart it!
handle_crash()
def handle_crash():
sleep(restart_timer) # Restarts the script after 2 seconds
start_script()
start_script()
如果你對我用於測試文件的代碼感興趣:'test.py',我把它貼在這里。
測試.py
from time import sleep
while True:
sleep(1)
print("Hello")
raise Exception("Hello")
不言而喻,如果 Python 腳本崩潰,它就無法自行重啟,因為它不再駐留在 memory 中。 那么,答案必須來自 Python 之外的東西,它在比應用程序更低的抽象級別上運行。
Linux 經常用 systemd 解決這個問題。 您可以創建一個描述應用程序運行的單元文件並啟動該服務。 systemd 然后將監視正在運行的進程,如果它死了,則重新啟動它。
Windows 通常使用 Windows 服務解決此問題,這些服務是帶有特殊 win32 API 包裝器的可執行文件,以允許系統調用它們以檢查它們的狀態、停止它們。 NSSM (非吸吮服務管理器)是一個有用的實用程序,可以從任意命令創建服務。
您必須使用一些外部服務來觀看您的 python 應用程序。 在 windows 中,您可以使用ZAEA23489CE3AA9B6406EBB28EZCDA將 python 應用程序作為 windows 服務運行
Windows 服務包裝器 (WinSW) 最初是為在 ZAEA23489CE3AA9B6406EBB24 機器中作為 Windows 服務運行 Jenkins 客戶端和服務器而開發的。 但與其他服務包裝器不同的是,WinSW 允許您運行任何其他應用程序,例如 python。
您可以將所有配置詳細信息作為 XML 文件提供。
您可能感興趣的一些配置
executable
->您可以定義要運行的可執行文件( python
在您的情況下)aruments
(例如 - 您可以提供您的應用程序)onFailure
--> 您可以使用onfailure
配置來指定應用程序失敗時要執行的操作。logpath
--> 您可以指定日志的位置。還有很多。 請閱讀此文件以了解所有配置。
您應該將配置 XML 文件放在 WinSW 可執行文件所在的同一目錄中。 還有一些必須實現的配置需要管理 windows 服務( id
、 name
、 description
、 executable
)。
您可以從此鏈接下載最新版本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.