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

