Python實現(xiàn)監(jiān)控一個程序的運行情況
一、前言
在使用selenium庫爬取一些小東西,經(jīng)常出現(xiàn)程序進入死循環(huán)的情況。導(dǎo)致一個簡簡單單的需求,居然花了3天沒跑完,很是氣憤。遂給寫了一個監(jiān)聽程序,當爬蟲死機一定時間的時候,就把這只爬蟲拍死,然后根據(jù)日志從上次爬的地方重啟一只新爬蟲。
二、使用psutil庫和subprocess庫介紹
當涉及到與操作系統(tǒng)進行交互的時候,Python中的 psutil 和 subprocess 庫都是非常有用的工具。
1.psutil 庫
psutil(process and system utilities)是一個跨平臺的庫,提供了許多有用的系統(tǒng)和進程信息。通過 psutil 庫,我們可以輕松地獲取操作系統(tǒng)的各種信息,如 CPU 使用情況、內(nèi)存使用情況、磁盤使用情況等等。此外,psutil 還可以用于獲取和操作進程信息,如獲取進程的 CPU 使用情況、內(nèi)存使用情況、打開的文件和網(wǎng)絡(luò)連接等等。
以下是 psutil 庫的一些主要功能:
- 獲取 CPU 使用率、內(nèi)存使用率、磁盤使用情況、網(wǎng)絡(luò)信息等等。
- 獲取系統(tǒng)啟動時間、用戶數(shù)、主機名等等系統(tǒng)信息。
- 獲取進程的 PID、CPU 使用情況、內(nèi)存使用情況、線程數(shù)等等信息。
- 操作進程,如發(fā)送信號、終止進程等等。
2.subprocess 庫
subprocess 庫是用于在 Python 程序中執(zhí)行外部命令的標準庫。通過 subprocess 庫,我們可以啟動一個子進程來執(zhí)行外部命令,然后在 Python 程序中捕獲并處理該命令的輸出。subprocess 庫提供了多個函數(shù),如 Popen、call、check_call 等等,以便于我們執(zhí)行外部命令和處理命令的輸出。
以下是 subprocess 庫的一些主要功能:
- 啟動子進程并執(zhí)行外部命令。
- 在子進程中捕獲并處理命令的輸出。
- 設(shè)置子進程的環(huán)境變量、工作目錄等等屬性。
- 通過管道連接多個子進程,從而實現(xiàn)數(shù)據(jù)流的處理。
總之,psutil 和 subprocess 是 Python 中非常有用的庫,可以幫助我們輕松地獲取和操作系統(tǒng)和進程的各種信息,以及執(zhí)行外部命令和處理命令的輸出。在編寫需要與操作系統(tǒng)進行交互的 Python 程序時,這兩個庫是不可或缺的。
三、使用psutil庫和subprocess庫示例程序
要監(jiān)控一個程序的運行情況并在需要時將其殺死并重啟,可以使用 Python 的 psutil 模塊來實現(xiàn)。psutil 模塊可以訪問系統(tǒng)進程和系統(tǒng)資源的信息,并提供了一些操作系統(tǒng)的 API 接口。具體來說,我們可以使用 psutil 模塊來獲取程序的 PID(進程ID),并在需要時將進程殺死并重啟。
下面是一個簡單的示例,演示了如何使用 psutil 模塊監(jiān)控程序的運行情況,并在需要時將進程殺死并重啟:
import psutil import subprocess import time # 啟動程序 p = subprocess.Popen(['python', 'your_program.py']) while True: # 檢查程序是否在運行 if psutil.pid_exists(p.pid) and psutil.pid_exists(p.pid) in psutil.pids(): # 如果程序在運行,等待一段時間后再檢查 time.sleep(5) else: # 如果程序已經(jīng)退出,重啟程序 p = subprocess.Popen(['python', 'your_program.py'])
在這個示例中,我們首先使用 subprocess.Popen() 啟動程序,并獲取程序的 PID。然后在一個無限循環(huán)中,不斷檢查程序是否在運行。如果程序在運行,我們會等待一段時間后再檢查。如果程序已經(jīng)退出,我們就使用 subprocess.Popen() 重新啟動程序。這樣,即使程序崩潰了,也能夠在很短的時間內(nèi)重新啟動。
需要注意的是,在監(jiān)控程序運行情況時,要確保程序出現(xiàn)異常不會導(dǎo)致系統(tǒng)崩潰或造成嚴重影響。如果程序出現(xiàn)無限循環(huán)、內(nèi)存泄漏等問題,監(jiān)控程序可能只會讓問題變得更加嚴重。因此,在編寫監(jiān)控程序時,要確保程序本身是健壯的,并且程序出現(xiàn)異常時能夠正確地退出。另外,要注意不要在監(jiān)控程序中占用過多的系統(tǒng)資源,以免影響其他程序的正常運行。
四、多進程通信
在 Python 中,可以使用 multiprocessing 庫來實現(xiàn)不同進程之間的交互。multiprocessing 是 Python 標準庫中的一個模塊,它允許我們啟動并發(fā)進程,以便于同時執(zhí)行多個任務(wù)。
在這里,由于需求不是很復(fù)雜,我用了一個取巧的方法,就是用一個txt文件當作中介,也可以了理解為池子,程序往里面丟日志。然后重啟的時候根據(jù)日志也就是爬到第幾個了,斷點重續(xù)。
下面程序功能是:當程序imgico.py50s不更新的時候,重啟。
import psutil import subprocess import time # 啟動程序 p = subprocess.Popen(['python', 'imgico.py']) preendNum=2 count=0 while True: # 檢查程序是否在運行 time.sleep(5) if psutil.pid_exists(p.pid) and psutil.pid_exists(p.pid) in psutil.pids(): # 如果程序在運行,等待一段時間后再檢查 time.sleep(5) else: # 如果程序已經(jīng)退出,重啟程序 p = subprocess.Popen(['python', 'imgico.py','--begin',str(endNum)]) with open('cache.txt', 'r', encoding='utf-8') as f: lines = f.readlines() if len(lines)==0: endNum=2 endNum = lines[len(lines) - 1].replace('\n', '') if preendNum==endNum: count+=1 else: preendNum = endNum count=0 if count==10: print('重啟一次!'+str(count)) p = subprocess.Popen(['python', 'imgico.py', '--begin', str(endNum)]) count=0
到此這篇關(guān)于Python實現(xiàn)監(jiān)控一個程序的運行情況的文章就介紹到這了,更多相關(guān)Python監(jiān)控程序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python中往列表中插入字典時,數(shù)據(jù)重復(fù)問題
這篇文章主要介紹了Python中往列表中插入字典時,數(shù)據(jù)重復(fù)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-02-02在PyTorch中實現(xiàn)可解釋的神經(jīng)網(wǎng)絡(luò)模型的方法詳解
這篇文章主要為大家介紹在PyTorch如何中實現(xiàn)可解釋的神經(jīng)網(wǎng)絡(luò)模型,并為您提供使用簡單的 PyTorch 接口實現(xiàn)最先進的基于概念的模型的工具,需要的朋友可以參考下2023-06-06使用Python實現(xiàn)文字轉(zhuǎn)語音并生成wav文件的例子
今天小編就為大家分享一篇使用Python實現(xiàn)文字轉(zhuǎn)語音并生成wav文件的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08Mac PyCharm中的.gitignore 安裝設(shè)置教程
這篇文章主要介紹了Mac PyCharm中的.gitignore 安裝設(shè)置教程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04python實現(xiàn)圖書館搶座(自動預(yù)約)功能的示例代碼
這篇文章主要介紹了python實現(xiàn)圖書館搶座(自動預(yù)約)功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09Python數(shù)學(xué)建模StatsModels統(tǒng)計回歸之線性回歸示例詳解
這篇文章主要為大家介紹了Python數(shù)學(xué)建模中StatsModels統(tǒng)計回歸之線性回歸的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-10-10