[Python] 実行中プロセスの一覧を確認する方法

Pythonで実行中のプロセスの一覧を確認するには、psutilライブラリを使用するのが一般的です。

psutilはシステムのプロセスやリソースの情報を取得するためのライブラリで、psutil.process_iter()を使うことで現在実行中のプロセスを取得できます。

各プロセスのIDや名前、CPU使用率などの詳細情報も取得可能です。

psutilは標準ライブラリではないため、事前にpip install psutilでインストールが必要です。

この記事でわかること
  • psutilライブラリの基本的な使い方
  • subprocessモジュールによるコマンド実行
  • プロセスの監視と管理方法
  • プロセス管理ツールの作成例
  • プロセス情報のリアルタイム取得方法

目次から探す

psutilライブラリを使ったプロセス一覧の取得

psutilとは

psutilは、Pythonでシステムのプロセスやシステムリソースの情報を取得するためのライブラリです。

CPU、メモリ、ディスク、ネットワークなどの情報を簡単に取得できるため、システム監視やプロセス管理に非常に便利です。

特に、プロセスの一覧を取得する機能が強力で、さまざまな情報を取得できます。

psutilのインストール方法

psutilは、Pythonのパッケージ管理ツールであるpipを使って簡単にインストールできます。

以下のコマンドを実行してください。

pip install psutil

psutil.process_iter()の使い方

psutil.process_iter()は、現在実行中のプロセスを反復処理するためのメソッドです。

このメソッドを使うことで、各プロセスの情報を簡単に取得できます。

以下はその使用例です。

import psutil
# 実行中のプロセスを取得
for process in psutil.process_iter():
    print(process)
psutil.Process(pid=1, name='python', ...)
psutil.Process(pid=2, name='bash', ...)
...

プロセスID(PID)とプロセス名の取得

プロセスのID(PID)やプロセス名を取得するには、process_iter()メソッドとプロセスオブジェクトのpidおよびname()メソッドを使用します。

以下のコードは、すべてのプロセスのPIDと名前を表示します。

import psutil
# プロセスのPIDと名前を取得
for process in psutil.process_iter():
    try:
        print(f'PID: {process.pid}, Name: {process.name()}')
    except (psutil.NoSuchProcess, psutil.AccessDenied):
        pass
PID: 1, Name: python
PID: 2, Name: bash
...

プロセスの詳細情報(CPU、メモリ使用率など)の取得

プロセスの詳細情報を取得するには、cpu_percent()memory_info()メソッドを使用します。

以下のコードは、各プロセスのCPU使用率とメモリ使用量を表示します。

import psutil
# プロセスの詳細情報を取得
for process in psutil.process_iter():
    try:
        cpu_usage = process.cpu_percent(interval=1)
        memory_info = process.memory_info()
        print(f'PID: {process.pid}, CPU Usage: {cpu_usage}%, Memory: {memory_info.rss} bytes')
    except (psutil.NoSuchProcess, psutil.AccessDenied):
        pass
PID: 1, CPU Usage: 0.0%, Memory: 12345678 bytes
PID: 2, CPU Usage: 0.1%, Memory: 23456789 bytes
...

プロセスのフィルタリング方法

特定の条件に基づいてプロセスをフィルタリングすることも可能です。

たとえば、特定の名前を持つプロセスのみを表示するには、以下のようにします。

import psutil
# 特定のプロセス名でフィルタリング
process_name = "python"
for process in psutil.process_iter():
    try:
        if process.name() == process_name:
            print(f'PID: {process.pid}, Name: {process.name()}')
    except (psutil.NoSuchProcess, psutil.AccessDenied):
        pass
PID: 1, Name: python
PID: 3, Name: python
...

このように、psutilライブラリを使用することで、Pythonで簡単に実行中のプロセスの一覧を取得し、詳細情報を管理することができます。

subprocessモジュールを使ったプロセスの確認

subprocessモジュールとは

subprocessモジュールは、Pythonから新しいプロセスを生成し、システムコマンドを実行するための標準ライブラリです。

このモジュールを使用することで、外部プログラムを呼び出したり、コマンドラインの操作をPythonから行ったりすることができます。

subprocessは、プロセスの入出力を管理するための強力な機能を提供します。

subprocess.run()を使ったシステムコマンドの実行

subprocess.run()は、指定したコマンドを実行し、その結果を取得するための関数です。

以下の例では、lsコマンドを使ってカレントディレクトリのファイル一覧を取得します。

import subprocess
# システムコマンドを実行
result = subprocess.run(['ls', '-l'], capture_output=True, text=True)
# 結果を表示
print(result.stdout)
total 0
-rw-r--r--  1 user  group  0 Jan 01 00:00 file1.txt
-rw-r--r--  1 user  group  0 Jan 01 00:00 file2.txt
...

psコマンドを使ったプロセス一覧の取得

Unix系のシステムでは、psコマンドを使用して実行中のプロセスの一覧を取得できます。

以下のコードは、psコマンドを使ってプロセス情報を取得し、表示します。

import subprocess
# psコマンドを実行
result = subprocess.run(['ps', 'aux'], capture_output=True, text=True)
# 結果を表示
print(result.stdout)
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
user      1234  0.0  0.1  123456  1234 ?        S    00:00   0:00 python script.py
...

tasklistコマンドを使ったWindowsでのプロセス確認

Windows環境では、tasklistコマンドを使用して実行中のプロセスを確認できます。

以下のコードは、tasklistコマンドを実行し、プロセスの一覧を表示します。

import subprocess
# tasklistコマンドを実行
result = subprocess.run(['tasklist'], capture_output=True, text=True)
# 結果を表示
print(result.stdout)
イメージ名                   PID セッション名        セッション#    メモリ使用量
======================== ======== ================ =========== ============
python.exe                1234 Console                    1      12,345 K
...

subprocessの出力をPythonで処理する方法

subprocess.run()の出力は、stdout属性を通じて取得できます。

この出力をPythonで処理することで、必要な情報を抽出することが可能です。

以下の例では、psコマンドの出力から特定のプロセス名を持つ行をフィルタリングします。

import subprocess
# psコマンドを実行
result = subprocess.run(['ps', 'aux'], capture_output=True, text=True)
# 出力を行ごとに分割
lines = result.stdout.splitlines()
# 特定のプロセス名でフィルタリング
process_name = "python"
for line in lines:
    if process_name in line:
        print(line)
user      1234  0.0  0.1  123456  1234 ?        S    00:00   0:00 python script.py
...

このように、subprocessモジュールを使用することで、システムコマンドを実行し、その結果をPythonで簡単に処理することができます。

プロセスの監視と管理

プロセスの監視とは

プロセスの監視とは、システム上で実行中のプロセスの状態やリソース使用状況を定期的にチェックすることを指します。

これにより、システムのパフォーマンスを最適化したり、異常な動作を早期に検知したりすることが可能です。

プロセスの監視は、特にサーバーや長時間実行されるアプリケーションにおいて重要です。

プロセスのCPU使用率を監視する

プロセスのCPU使用率を監視するには、psutilライブラリのcpu_percent()メソッドを使用します。

以下のコードは、特定のプロセスのCPU使用率を定期的に表示します。

import psutil
import time
# 監視するプロセスのPID
pid = 1234  # ここに監視したいプロセスのPIDを指定
try:
    process = psutil.Process(pid)
    while True:
        cpu_usage = process.cpu_percent(interval=1)
        print(f'PID: {pid}, CPU Usage: {cpu_usage}%')
except psutil.NoSuchProcess:
    print(f'プロセス {pid} は存在しません。')
PID: 1234, CPU Usage: 5.0%
PID: 1234, CPU Usage: 3.5%
...

プロセスのメモリ使用量を監視する

プロセスのメモリ使用量を監視するには、memory_info()メソッドを使用します。

以下のコードは、特定のプロセスのメモリ使用量を表示します。

import psutil
import time
# 監視するプロセスのPID
pid = 1234  # ここに監視したいプロセスのPIDを指定
try:
    process = psutil.Process(pid)
    while True:
        memory_info = process.memory_info()
        print(f'PID: {pid}, Memory Usage: {memory_info.rss} bytes')
        time.sleep(1)
except psutil.NoSuchProcess:
    print(f'プロセス {pid} は存在しません。')
PID: 1234, Memory Usage: 12345678 bytes
PID: 1234, Memory Usage: 12365432 bytes
...

特定のプロセスを終了させる方法

特定のプロセスを終了させるには、terminate()メソッドを使用します。

以下のコードは、指定したPIDのプロセスを終了させる例です。

import psutil
# 終了させるプロセスのPID
pid = 1234  # ここに終了させたいプロセスのPIDを指定
try:
    process = psutil.Process(pid)
    process.terminate()  # プロセスを終了
    print(f'プロセス {pid} を終了しました。')
except psutil.NoSuchProcess:
    print(f'プロセス {pid} は存在しません。')
except psutil.AccessDenied:
    print(f'プロセス {pid} を終了する権限がありません。')
プロセス 1234 を終了しました。

プロセスの優先度を変更する方法

プロセスの優先度を変更するには、nice()メソッドを使用します。

以下のコードは、指定したPIDのプロセスの優先度を変更する例です。

import psutil
# 優先度を変更するプロセスのPID
pid = 1234  # ここに優先度を変更したいプロセスのPIDを指定
try:
    process = psutil.Process(pid)
    process.nice(psutil.HIGH_PRIORITY_CLASS)  # 優先度を高く設定
    print(f'プロセス {pid} の優先度を変更しました。')
except psutil.NoSuchProcess:
    print(f'プロセス {pid} は存在しません。')
except psutil.AccessDenied:
    print(f'プロセス {pid} の優先度を変更する権限がありません。')
プロセス 1234 の優先度を変更しました。

このように、プロセスの監視と管理を行うことで、システムのパフォーマンスを最適化し、必要に応じてプロセスを制御することができます。

応用例:プロセス管理ツールの作成

プロセス一覧を定期的に取得するスクリプト

以下のスクリプトは、psutilライブラリを使用して、実行中のプロセスの一覧を定期的に取得し、表示します。

指定した間隔でプロセス情報を更新します。

import psutil
import time
# プロセス一覧を定期的に取得する間隔(秒)
interval = 5
while True:
    print("実行中のプロセス一覧:")
    for process in psutil.process_iter(['pid', 'name']):
        print(f'PID: {process.info["pid"]}, Name: {process.info["name"]}')
    print("\n" + "-" * 40 + "\n")
    time.sleep(interval)
実行中のプロセス一覧:
PID: 1, Name: python
PID: 2, Name: bash
...
----------------------------------------

プロセスのリソース使用量をログに記録する

このスクリプトは、特定のプロセスのCPU使用率とメモリ使用量を定期的に取得し、ログファイルに記録します。

import psutil
import time
# 監視するプロセスのPID
pid = 1234  # ここに監視したいプロセスのPIDを指定
log_file = "process_usage.log"
try:
    process = psutil.Process(pid)
    with open(log_file, "a") as f:
        while True:
            cpu_usage = process.cpu_percent(interval=1)
            memory_info = process.memory_info()
            f.write(f'PID: {pid}, CPU Usage: {cpu_usage}%, Memory: {memory_info.rss} bytes\n')
            time.sleep(1)
except psutil.NoSuchProcess:
    print(f'プロセス {pid} は存在しません。')

出力結果(process_usage.logファイルの内容):

PID: 1234, CPU Usage: 5.0%, Memory: 12345678 bytes
PID: 1234, CPU Usage: 3.5%, Memory: 12365432 bytes
...

特定のプロセスが終了したら通知するスクリプト

以下のスクリプトは、特定のプロセスが終了した場合に通知を行います。

プロセスが終了するまで監視を続けます。

import psutil
import time
# 監視するプロセスのPID
pid = 1234  # ここに監視したいプロセスのPIDを指定
try:
    process = psutil.Process(pid)
    while True:
        if not process.is_running():
            print(f'プロセス {pid} は終了しました。')
            break
        time.sleep(1)
except psutil.NoSuchProcess:
    print(f'プロセス {pid} は存在しません。')
プロセス 1234 は終了しました。

プロセスの自動再起動スクリプト

このスクリプトは、特定のプロセスが終了した場合に自動的に再起動します。

プロセスの実行ファイルのパスを指定する必要があります。

import psutil
import subprocess
import time
# 監視するプロセスの実行ファイルのパス
process_path = "python script.py"  # ここに実行したいプロセスのパスを指定
while True:
    # プロセスが実行中か確認
    is_running = False
    for process in psutil.process_iter(['name']):
        if process.info['name'] == 'python':
            is_running = True
            break
    if not is_running:
        print(f'プロセスが終了しました。再起動します: {process_path}')
        subprocess.Popen(process_path, shell=True)  # プロセスを再起動
    time.sleep(5)  # 5秒ごとに確認
プロセスが終了しました。再起動します: python script.py

これらのスクリプトを使用することで、プロセスの監視や管理を自動化し、システムの安定性を向上させることができます。

よくある質問

psutilはどのOSで動作しますか?

psutilは、Windows、Linux、macOSなどの主要なオペレーティングシステムで動作します。

各OSにおいて、プロセスやシステムリソースの情報を取得するためのAPIを利用しているため、プラットフォームに依存せずに使用できます。

ただし、一部の機能はOSによって異なる場合があるため、使用する際にはドキュメントを確認することをお勧めします。

subprocessとpsutilの違いは何ですか?

subprocessは、Pythonから外部プログラムやシステムコマンドを実行するためのモジュールです。

主に新しいプロセスを生成し、その入出力を管理するために使用されます。

一方、psutilは、実行中のプロセスやシステムリソースの情報を取得するためのライブラリです。

つまり、subprocessはプロセスを作成するために使用し、psutilは既存のプロセスの情報を取得するために使用します。

プロセスの情報をリアルタイムで取得する方法はありますか?

はい、psutilを使用することで、プロセスの情報をリアルタイムで取得することができます。

process_iter()メソッドを使用して、実行中のプロセスを反復処理し、cpu_percent()memory_info()メソッドを使って、CPU使用率やメモリ使用量を定期的に取得することが可能です。

以下は、リアルタイムでプロセスのCPU使用率を取得する例です。

import psutil
import time
# プロセスのPIDを指定
pid = 1234  # 監視したいプロセスのPIDを指定
try:
    process = psutil.Process(pid)
    while True:
        cpu_usage = process.cpu_percent(interval=1)
        print(f'PID: {pid}, CPU Usage: {cpu_usage}%')
except psutil.NoSuchProcess:
    print(f'プロセス {pid} は存在しません。')

このように、psutilを使うことで、プロセスの情報をリアルタイムで監視することができます。

まとめ

この記事では、Pythonを使用して実行中のプロセスを管理するためのさまざまな方法について解説しました。

具体的には、psutilライブラリを用いたプロセスの一覧取得や詳細情報の取得、さらにプロセスの監視や管理に関するスクリプトの作成方法を紹介しました。

これらの知識を活用することで、システムのパフォーマンスを向上させたり、特定のプロセスを効率的に管理したりすることが可能になります。

ぜひ、実際にコードを試してみて、プロセス管理ツールを自分のニーズに合わせてカスタマイズしてみてください。

  • URLをコピーしました!
目次から探す