亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python實(shí)現(xiàn)監(jiān)控一個(gè)程序的運(yùn)行情況

 更新時(shí)間:2023年05月10日 17:02:59   作者:風(fēng)吹落葉花飄蕩  
這篇文章主要為大家介紹了Python如何實(shí)現(xiàn)監(jiān)控一個(gè)程序的運(yùn)行情況,然后視情況將進(jìn)程殺死并重啟,文中的示例代碼簡(jiǎn)潔易懂,需要的可以參考一下

一、前言

在使用selenium庫(kù)爬取一些小東西,經(jīng)常出現(xiàn)程序進(jìn)入死循環(huán)的情況。導(dǎo)致一個(gè)簡(jiǎn)簡(jiǎn)單單的需求,居然花了3天沒(méi)跑完,很是氣憤。遂給寫(xiě)了一個(gè)監(jiān)聽(tīng)程序,當(dāng)爬蟲(chóng)死機(jī)一定時(shí)間的時(shí)候,就把這只爬蟲(chóng)拍死,然后根據(jù)日志從上次爬的地方重啟一只新爬蟲(chóng)。

二、使用psutil庫(kù)和subprocess庫(kù)介紹

當(dāng)涉及到與操作系統(tǒng)進(jìn)行交互的時(shí)候,Python中的 psutil 和 subprocess 庫(kù)都是非常有用的工具。

1.psutil 庫(kù)

psutil(process and system utilities)是一個(gè)跨平臺(tái)的庫(kù),提供了許多有用的系統(tǒng)和進(jìn)程信息。通過(guò) psutil 庫(kù),我們可以輕松地獲取操作系統(tǒng)的各種信息,如 CPU 使用情況、內(nèi)存使用情況、磁盤(pán)使用情況等等。此外,psutil 還可以用于獲取和操作進(jìn)程信息,如獲取進(jìn)程的 CPU 使用情況、內(nèi)存使用情況、打開(kāi)的文件和網(wǎng)絡(luò)連接等等。

以下是 psutil 庫(kù)的一些主要功能:

  • 獲取 CPU 使用率、內(nèi)存使用率、磁盤(pán)使用情況、網(wǎng)絡(luò)信息等等。
  • 獲取系統(tǒng)啟動(dòng)時(shí)間、用戶(hù)數(shù)、主機(jī)名等等系統(tǒng)信息。
  • 獲取進(jìn)程的 PID、CPU 使用情況、內(nèi)存使用情況、線(xiàn)程數(shù)等等信息。
  • 操作進(jìn)程,如發(fā)送信號(hào)、終止進(jìn)程等等。

2.subprocess 庫(kù)

subprocess 庫(kù)是用于在 Python 程序中執(zhí)行外部命令的標(biāo)準(zhǔn)庫(kù)。通過(guò) subprocess 庫(kù),我們可以啟動(dòng)一個(gè)子進(jìn)程來(lái)執(zhí)行外部命令,然后在 Python 程序中捕獲并處理該命令的輸出。subprocess 庫(kù)提供了多個(gè)函數(shù),如 Popen、call、check_call 等等,以便于我們執(zhí)行外部命令和處理命令的輸出。

以下是 subprocess 庫(kù)的一些主要功能:

  • 啟動(dòng)子進(jìn)程并執(zhí)行外部命令。
  • 在子進(jìn)程中捕獲并處理命令的輸出。
  • 設(shè)置子進(jìn)程的環(huán)境變量、工作目錄等等屬性。
  • 通過(guò)管道連接多個(gè)子進(jìn)程,從而實(shí)現(xiàn)數(shù)據(jù)流的處理。

總之,psutil 和 subprocess 是 Python 中非常有用的庫(kù),可以幫助我們輕松地獲取和操作系統(tǒng)和進(jìn)程的各種信息,以及執(zhí)行外部命令和處理命令的輸出。在編寫(xiě)需要與操作系統(tǒng)進(jìn)行交互的 Python 程序時(shí),這兩個(gè)庫(kù)是不可或缺的。

三、使用psutil庫(kù)和subprocess庫(kù)示例程序

要監(jiān)控一個(gè)程序的運(yùn)行情況并在需要時(shí)將其殺死并重啟,可以使用 Python 的 psutil 模塊來(lái)實(shí)現(xiàn)。psutil 模塊可以訪(fǎng)問(wèn)系統(tǒng)進(jìn)程和系統(tǒng)資源的信息,并提供了一些操作系統(tǒng)的 API 接口。具體來(lái)說(shuō),我們可以使用 psutil 模塊來(lái)獲取程序的 PID(進(jìn)程ID),并在需要時(shí)將進(jìn)程殺死并重啟。

下面是一個(gè)簡(jiǎn)單的示例,演示了如何使用 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è)無(wú)限循環(huán)中,不斷檢查程序是否在運(yùn)行。如果程序在運(yùn)行,我們會(huì)等待一段時(shí)間后再檢查。如果程序已經(jīng)退出,我們就使用 subprocess.Popen() 重新啟動(dòng)程序。這樣,即使程序崩潰了,也能夠在很短的時(shí)間內(nèi)重新啟動(dòng)。

需要注意的是,在監(jiān)控程序運(yùn)行情況時(shí),要確保程序出現(xiàn)異常不會(huì)導(dǎo)致系統(tǒng)崩潰或造成嚴(yán)重影響。如果程序出現(xiàn)無(wú)限循環(huán)、內(nèi)存泄漏等問(wèn)題,監(jiān)控程序可能只會(huì)讓問(wèn)題變得更加嚴(yán)重。因此,在編寫(xiě)監(jiān)控程序時(shí),要確保程序本身是健壯的,并且程序出現(xiàn)異常時(shí)能夠正確地退出。另外,要注意不要在監(jiān)控程序中占用過(guò)多的系統(tǒng)資源,以免影響其他程序的正常運(yùn)行。

四、多進(jìn)程通信

在 Python 中,可以使用 multiprocessing 庫(kù)來(lái)實(shí)現(xiàn)不同進(jìn)程之間的交互。multiprocessing 是 Python 標(biāo)準(zhǔn)庫(kù)中的一個(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論