[Python] 実行中プロセスの一覧を確認する方法
Pythonで実行中のプロセスの一覧を確認するには、psutil
ライブラリを使用するのが一般的です。
psutil
はシステムのプロセスやリソースの情報を取得するためのライブラリで、psutil.process_iter()
を使うことで現在実行中のプロセスを取得できます。
各プロセスのIDや名前、CPU使用率などの詳細情報も取得可能です。
psutil
は標準ライブラリではないため、事前にpip install psutil
でインストールが必要です。
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
これらのスクリプトを使用することで、プロセスの監視や管理を自動化し、システムの安定性を向上させることができます。
まとめ
この記事では、Pythonを使用して実行中のプロセスを管理するためのさまざまな方法について解説しました。
具体的には、psutil
ライブラリを用いたプロセスの一覧取得や詳細情報の取得、さらにプロセスの監視や管理に関するスクリプトの作成方法を紹介しました。
これらの知識を活用することで、システムのパフォーマンスを向上させたり、特定のプロセスを効率的に管理したりすることが可能になります。
ぜひ、実際にコードを試してみて、プロセス管理ツールを自分のニーズに合わせてカスタマイズしてみてください。