欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python實現(xiàn)監(jiān)控一個程序的運行情況

 更新時間:2023年05月10日 17:02:59   作者:風(fēng)吹落葉花飄蕩  
這篇文章主要為大家介紹了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)文章

最新評論