Python被遠(yuǎn)程主機(jī)強(qiáng)制關(guān)閉后自動重新運(yùn)行進(jìn)程的示例
要實(shí)現(xiàn)Python程序在被遠(yuǎn)程主機(jī)強(qiáng)制關(guān)閉后能夠自動重新運(yùn)行,我們可以采用幾種方法,但最直接且常用的方法之一是結(jié)合操作系統(tǒng)級的工具或腳本。在Linux系統(tǒng)中,我們可以使用cron
作業(yè)或者systemd
服務(wù)來實(shí)現(xiàn)這一功能;在Windows系統(tǒng)中,可以使用任務(wù)計劃程序
。但在這里,為了提供一個跨平臺的、更靈活的解決方案,我們可以編寫一個簡單的Python腳本來監(jiān)控主程序,并在檢測到主程序被關(guān)閉后重新啟動它。
1.使用了Python的subprocess模塊來啟動和監(jiān)控主程序示例
1.1腳本的示例
以下是一個Python腳本的示例,該腳本將監(jiān)控另一個Python程序(例如main_program.py
)的運(yùn)行狀態(tài),并在它退出時重新啟動它。這個監(jiān)控腳本使用了Python的subprocess
模塊來啟動和監(jiān)控主程序,以及time.sleep
來周期性檢查主程序是否還在運(yùn)行。
import subprocess import time def run_main_program(): # 啟動主程序 print("Starting main_program.py...") try: # 使用subprocess.Popen啟動主程序,確保可以捕獲其PID process = subprocess.Popen(['python', 'main_program.py']) # 等待主程序結(jié)束 process.wait() print("main_program.py has exited. Restarting...") except Exception as e: print(f"An error occurred: {e}. Trying to restart main_program.py...") if __name__ == "__main__": while True: run_main_program() # 等待一段時間后再重新啟動(例如每5分鐘) time.sleep(300) # 300秒 = 5分鐘 # 注意:我們需要將'main_program.py'替換為我們的主程序文件名。 # 此外,請確保這個監(jiān)控腳本和主程序在同一個目錄下,或者提供完整的路徑給subprocess.Popen。
1.2說明
(1)主程序文件:我們需要將main_program.py
替換為我們希望監(jiān)控并自動重啟的Python程序文件名。
(2)錯誤處理:上述腳本包含了基本的錯誤處理,以便在主程序啟動失敗時能夠輸出錯誤信息并嘗試重新啟動。
(3)重啟間隔:time.sleep(300)
設(shè)置了重啟之間的等待時間為5分鐘。我們可以根據(jù)需要調(diào)整這個值。
(4)跨平臺兼容性:這個腳本在Linux和Windows上都應(yīng)該能夠工作,只要Python環(huán)境已經(jīng)設(shè)置好,并且main_program.py
是可執(zhí)行的。
1.3注意
(1)如果主程序是因?yàn)楫惓;蝈e誤而頻繁退出,僅僅通過重啟可能不是解決問題的最佳方法。在這種情況下,我們應(yīng)該首先調(diào)查并修復(fù)主程序中的錯誤。
(2)這個腳本以無限循環(huán)的方式運(yùn)行,直到我們手動停止它。在生產(chǎn)環(huán)境中,我們可能希望使用更健壯的服務(wù)管理工具(如systemd或Windows服務(wù))來管理它。
對于需要更高級的解決方案來應(yīng)對Python程序被遠(yuǎn)程主機(jī)強(qiáng)制關(guān)閉后自動重新運(yùn)行進(jìn)程的問題,我們可以考慮使用守護(hù)進(jìn)程管理工具如supervisor
,或者編寫更復(fù)雜的重試邏輯結(jié)合異常處理。以下將詳細(xì)介紹這兩種方法:
2.使用supervisor工具
supervisor
是一個用Python編寫的守護(hù)進(jìn)程管理工具,它可以監(jiān)控我們的應(yīng)用程序,并在崩潰或異常退出時自動重啟應(yīng)用程序。這種方法適用于生產(chǎn)環(huán)境,因?yàn)樗峁┝烁€(wěn)定和可靠的監(jiān)控與重啟機(jī)制。
步驟:
(1)安裝supervisor:
在命令行中運(yùn)行以下命令來安裝supervisor(以Linux為例):
sudo apt-get install supervisor # Debian/Ubuntu sudo yum install supervisor # CentOS/RHEL
(2)配置supervisor:
創(chuàng)建一個配置文件(例如myapp.conf
),并在其中指定要監(jiān)控的Python應(yīng)用程序的詳細(xì)信息。配置文件通常位于/etc/supervisor/conf.d/
目錄下。配置文件的示例如下:
[program:myapp] command = python /path/to/your/app.py directory = /path/to/your/app user = your_username autostart = true autorestart = true startsecs = 5 stopwaitsecs = 600 environment = ENV_VAR_1=value, ENV_VAR_2=value
根據(jù)我們的應(yīng)用程序的實(shí)際路徑和需要設(shè)置相應(yīng)的值。
(3)啟動supervisor:
運(yùn)行以下命令來啟動supervisor并重新讀取配置文件:
sudo supervisorctl reread sudo supervisorctl update
(4)監(jiān)控和管理應(yīng)用程序:
使用以下命令來監(jiān)控和管理由supervisor管理的應(yīng)用程序:
sudo supervisorctl status sudo supervisorctl tail -f myapp sudo supervisorctl restart myapp sudo supervisorctl stop myapp
3.編寫復(fù)雜的重試邏輯結(jié)合異常處理
如果我們不想使用額外的工具,可以在Python腳本中編寫更復(fù)雜的重試邏輯和異常處理機(jī)制。這種方法更加靈活,但可能需要更多的代碼和邏輯來確保穩(wěn)定性和可靠性。
示例代碼:
import time import random def remote_task(): """模擬與遠(yuǎn)程主機(jī)的交互,可能因連接關(guān)閉而拋出異常""" # 隨機(jī)模擬成功與失敗 if random.choice([True, False]): print("任務(wù)執(zhí)行成功") else: raise ConnectionError("與遠(yuǎn)程主機(jī)連接失敗") def run_task(): max_retries = 5 # 最大重試次數(shù) retry_interval = 5 # 重試間隔(秒) retries = 0 while retries < max_retries: try: remote_task() break # 成功后跳出循環(huán) except ConnectionError as e: print(e) print(f"正在嘗試重新連接...(剩余重試次數(shù):{max_retries - retries - 1})") time.sleep(retry_interval) retries += 1 if retries == max_retries: print("達(dá)到最大重試次數(shù),任務(wù)執(zhí)行失敗。") if __name__ == "__main__": run_task()
在這個示例中,我們定義了一個remote_task
函數(shù)來模擬與遠(yuǎn)程主機(jī)的交互,并可能拋出ConnectionError
異常。run_task
函數(shù)則負(fù)責(zé)在一個循環(huán)中運(yùn)行remote_task
,并在捕獲到ConnectionError
時根據(jù)設(shè)定的最大重試次數(shù)和重試間隔進(jìn)行重試。
總結(jié)
對于需要更高級解決方案的場景,推薦使用supervisor
等守護(hù)進(jìn)程管理工具,因?yàn)樗鼈兲峁┝烁€(wěn)定和可靠的監(jiān)控與重啟機(jī)制。然而,如果我們希望在不引入額外工具的情況下實(shí)現(xiàn)類似功能,編寫復(fù)雜的重試邏輯和異常處理機(jī)制也是一個可行的選擇。
到此這篇關(guān)于Python被遠(yuǎn)程主機(jī)強(qiáng)制關(guān)閉后自動重新運(yùn)行進(jìn)程的示例的文章就介紹到這了,更多相關(guān)Python自動重新運(yùn)行進(jìn)程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python自動化測試框架pytest的詳解安裝與運(yùn)行
- 自動在Windows中運(yùn)行Python腳本并定時觸發(fā)功能實(shí)現(xiàn)
- Appium+Python自動化測試之運(yùn)行App程序示例
- Python被遠(yuǎn)程主機(jī)強(qiáng)制關(guān)閉后自動重新運(yùn)行進(jìn)程的示例
- Python?Pexpect庫自動化交互式進(jìn)程控制的expect_list方法解析
- 如何用 Python 子進(jìn)程關(guān)閉 Excel 自動化中的彈窗
- Python with用法:自動關(guān)閉文件進(jìn)程
- 使用Python的Supervisor進(jìn)行進(jìn)程監(jiān)控以及自動啟動
相關(guān)文章
Python Threading 線程/互斥鎖/死鎖/GIL鎖
這篇文章主要介紹了Python Threading 線程/互斥鎖/死鎖/GIL鎖的相關(guān)知識,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-07-07使用python+pandas讀寫xlsx格式中的數(shù)據(jù)
這篇文章主要介紹了使用python+pandas讀寫xlsx格式中的數(shù)據(jù),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下2022-08-08

pytorch之關(guān)于PyTorch結(jié)構(gòu)介紹

Python3.x爬蟲下載網(wǎng)頁圖片的實(shí)例講解