簡體   English   中英

如何在 python 程序崩潰后重新啟動它

[英]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 個選項:

  1. 確保您的 python 腳本不會崩潰,這是非常推薦的。 您可以通過處理程序拋出的異常來做到這一點。

選項1

我假設您是 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()
  1. 如果要重新啟動 python 腳本,則需要另一個 python 腳本(假設您想使用 python 執行此操作)檢查進程是否仍然存在,如果沒有,則使用 python 再次運行它。

選項 2

這是通過命令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 服務( idnamedescriptionexecutable )。

您可以從此鏈接下載最新版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM