テックブログ

コラム

ChatGPT Linux

PythonとChatGPTを利用してオリジナルコマンドを作成

はじめまして、新人のRKです。

これからよろしくおねがいします!

クリスマス、いかがお過ごしでしょうか。

突然ですが…

少し見づらくないですか?

これはLinuxコマンドのサーバー監視で使われるtopコマンドを使用した結果です。

Linuxに慣れていたりtopコマンドをよく見ている人には見慣れているかもしれませんが、

初心者にはよくわかりません。

これが日本語でわかりやすく表示してくれると見やすいですよね。

例えば…

日本語で表示してくれるとわかりやすいですね。

実はこれ、ChatGPTに依頼してPythonで作成しました。

では、実際に作成した手順を見てみましょう。

元となるコードを書いてもらう

丁寧に必要なライブラリのインストール方法まで教えてくれています。優しいですね。

実際にインストールしてみる

まずは、ライブラリのインストールから実行してみましょう。

# pip install psutil
Collecting psutil
  Using cached psutil-5.9.6-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (283 kB)
Installing collected packages: psutil
Successfully installed psutil-5.9.6

無事、インストールすることができました。

続いて、書いてくれたコードを打ち込んで実行してみましょう。

# vim topwakaru.py
import psutil
import time

def display_top():
    while True:
        processes = []
        for process in psutil.process_iter(['pid', 'name', 'memory_percent', 'cpu_percent']):
            processes.append(process.info)

        processes.sort(key=lambda x: x['cpu_percent'], reverse=True)

        print(f"{'PID':<10} {'名前':<25} {'メモリ使用率(%)':<15} {'CPU使用率(%)':<15}")
        for p in processes[:10]:
            print(f"{p['pid']:<10} {p['name']:<25} {p['memory_percent']:<15} {p['cpu_percent']:<15}")

        time.sleep(2)
        print("\n" * 5)

if __name__ == "__main__":
    display_top()

以下のコマンドを使用して、実際に起動してみましょう。

# python3 topwakaru.py

このような結果が表示されました。ですがこれでは、topコマンドの上部のシステム全体の情報も欲しいところです。

システム全体の情報も表示してもらうようにする

続いて、topコマンドの上部の部分も表示してもらうコードを書いてもらいました。

では、先程作成したファイルに編集してみましょう。

# vim topwakaru.py
import psutil
import time
import datetime

def display_top():
    while True:
        # システム全体の情報
        uptime = datetime.datetime.now() - datetime.datetime.fromtimestamp(psutil.boot_time())
        uptime_days = uptime.days
        uptime_hours, temp = divmod(uptime.seconds, 3600)
        uptime_minutes, uptime_seconds = divmod(temp, 60)

        load_avg_1, load_avg_5, load_avg_15 = psutil.getloadavg()

        cpu_percent = psutil.cpu_percent(percpu=True)

        mem_info = psutil.virtual_memory()
        swap_info = psutil.swap_memory()

        # プロセスの情報
        processes = []
        for process in psutil.process_iter(['pid', 'name', 'memory_info', 'cpu_percent']):
            processes.append(process.info)

        processes.sort(key=lambda x: x['cpu_percent'], reverse=True)

        print(f"top - {datetime.datetime.now().strftime('%H:%M:%S')} up {uptime_days} days, {uptime_hours:02}:{uptime_minutes:02},  load average: {load_avg_1:.2f}, {load_avg_5:.2f}, {load_avg_15:.2f}")
        print(f"Tasks: {len(processes)} total,   {len([p for p in processes if p['status'] == 'running'])} running, {len([p for p in processes if p['status'] == 'sleeping'])} sleeping,   0 stopped,   0 zombie")
        print(f"%Cpu(s): {sum(cpu_percent)/len(cpu_percent):.1f} us,  0.0 sy,  0.0 ni, {100-sum(cpu_percent)/len(cpu_percent):.1f} id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st")
        print(f"MiB Mem : {mem_info.total/(1024**2):.1f} total, {mem_info.available/(1024**2):.1f} free, {mem_info.used/(1024**2):.1f} used, {mem_info.cached/(1024**2):.1f} buff/cache")
        print(f"MiB Swap: {swap_info.total/(1024**2):.1f} total, {swap_info.free/(1024**2):.1f} free, {swap_info.used/(1024**2):.1f} used. {mem_info.available/(1024**2):.1f} avail Mem ")
        print()

        print(f"{'PID':<6} {'名前':<25} {'メモリ(MiB)':<15} {'CPU(%)':<10}")
        for p in processes[:10]:
            print(f"{p['pid']:<6} {p['name']:<25} {p['memory_info'].rss/(1024**2):<15.1f} {p['cpu_percent']:<10.1f}")

        time.sleep(2)
        print("\n" * 5)

if __name__ == "__main__":
    display_top()

実際に実行してみましょう。

# python3 topwakaru.py
top - 00:16:22 up 5 days, 18:49,  load average: 0.00, 0.00, 0.00
Traceback (most recent call last):
  File "/root/pison2.py", line 42, in <module>
    display_top()
  File "/root/pison2.py", line 28, in display_top
    print(f"Tasks: {len(processes)} total,   {len([p for p in processes if p['status'] == 'running'])} running, {len([p for p in processes if p['status'] == 'sleeping'])} sleeping,   0 stopped,   0 zombie")
  File "/root/pison2.py", line 28, in <listcomp>
    print(f"Tasks: {len(processes)} total,   {len([p for p in processes if p['status'] == 'running'])} running, {len([p for p in processes if p['status'] == 'sleeping'])} sleeping,   0 stopped,   0 zombie")
KeyError: 'status'

エラーが発生しましたね。でもchatGPTならデバック、修正もしてくれます。

エラー文をそのまま送ってみましょう。

このように、エラー文を解説してくれて修正までしてくれます。

AIだってミスをするんだなってことでコードを入力してみましょう。

# vim topwakaru.py
import psutil
import time
import datetime

def display_top():
    while True:
        # システム全体の情報
        uptime = datetime.datetime.now() - datetime.datetime.fromtimestamp(psutil.boot_time())
        uptime_days = uptime.days
        uptime_hours, temp = divmod(uptime.seconds, 3600)
        uptime_minutes, uptime_seconds = divmod(temp, 60)

        load_avg_1, load_avg_5, load_avg_15 = psutil.getloadavg()

        cpu_percent = psutil.cpu_percent(percpu=True)

        mem_info = psutil.virtual_memory()
        swap_info = psutil.swap_memory()

        # プロセスの情報
        processes = []
        for process in psutil.process_iter(['pid', 'name', 'memory_info', 'cpu_percent', 'status']):
            processes.append(process.info)

        processes.sort(key=lambda x: x['cpu_percent'], reverse=True)

        print(f"top - {datetime.datetime.now().strftime('%H:%M:%S')} up {uptime_days} days, {uptime_hours:02}:{uptime_minutes:02},  load average: {load_avg_1:.2f}, {load_avg_5:.2f}, {load_avg_15:.2f}")
        print(f"Tasks: {len(processes)} total,   {len([p for p in processes if p['status'] == 'running'])} running, {len([p for p in processes if p['status'] == 'sleeping'])} sleeping,   0 stopped,   0 zombie")
        print(f"%Cpu(s): {sum(cpu_percent)/len(cpu_percent):.1f} us,  0.0 sy,  0.0 ni, {100-sum(cpu_percent)/len(cpu_percent):.1f} id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st")
        print(f"MiB Mem : {mem_info.total/(1024**2):.1f} total, {mem_info.available/(1024**2):.1f} free, {mem_info.used/(1024**2):.1f} used, {mem_info.cached/(1024**2):.1f} buff/cache")
        print(f"MiB Swap: {swap_info.total/(1024**2):.1f} total, {swap_info.free/(1024**2):.1f} free, {swap_info.used/(1024**2):.1f} used. {mem_info.available/(1024**2):.1f} avail Mem ")
        print()

        print(f"{'PID':<6} {'名前':<25} {'メモリ(MiB)':<15} {'CPU(%)':<10}")
        for p in processes[:10]:
            print(f"{p['pid']:<6} {p['name']:<25} {p['memory_info'].rss/(1024**2):<15.1f} {p['cpu_percent']:<10.1f}")

        time.sleep(2)
        print("\n" * 5)

if __name__ == "__main__":
    display_top()

主な変更点は、

「for process in psutil.process_iter([‘pid’, ‘name’, ‘memory_info’, ‘cpu_percent’, ‘status‘]):」ですね。

それでは、実際に実行させてみましょう。

# python3 topwakaru.py

上部が表示されましたが、英語なのでわかりませんね。

上部も翻訳してもらって更にカラフルにしてもらう

丁寧に必要なモジュールまで表示してくれていますね。

それでは、モジュールのインストールをしてみましょう。

# pip3 install rich
Collecting rich
  Using cached rich-13.7.0-py3-none-any.whl (240 kB)
Requirement already satisfied: markdown-it-py>=2.2.0 in /usr/local/lib/python3.9/site-packages (from rich) (3.0.0)
Requirement already satisfied: pygments<3.0.0,>=2.13.0 in /usr/local/lib/python3.9/site-packages (from rich) (2.16.1)
Requirement already satisfied: mdurl~=0.1 in /usr/local/lib/python3.9/site-packages (from markdown-it-py>=2.2.0->rich) (0.1.2)
Installing collected packages: rich
Successfully installed rich-13.7.0

モジュールのインストールは問題無くできました。

続いて、コードの記入をしましょう。

# vim topwakaru.py
from rich.console import Console
import psutil
import time
import datetime

console = Console()

def display_top():
    while True:
        # システム全体の情報
        uptime = datetime.datetime.now() - datetime.datetime.fromtimestamp(psutil.boot_time())
        uptime_days = uptime.days
        uptime_hours, temp = divmod(uptime.seconds, 3600)
        uptime_minutes, uptime_seconds = divmod(temp, 60)

        load_avg_1, load_avg_5, load_avg_15 = psutil.getloadavg()

        cpu_percent = psutil.cpu_percent(percpu=True)

        mem_info = psutil.virtual_memory()
        swap_info = psutil.swap_memory()

        # プロセスの情報
        processes = []
        for process in psutil.process_iter(['pid', 'name', 'memory_info', 'cpu_percent', 'status']):
            processes.append(process.info)

        processes.sort(key=lambda x: x['cpu_percent'], reverse=True)

        console.print(f"トップ - [yellow]{datetime.datetime.now().strftime('%H:%M:%S')}[/yellow] 経過時間 [red]{uptime_days} 日[/red], {uptime_hours:02}:{uptime_minutes:02},  平均負荷: {load_avg_1:.2f}, {load_avg_5:.2f}, {load_avg_15:.2f}", style="bold")
        console.print(f"タスク: [green]{len(processes)}[/green] 全体,   {len([p for p in processes if p['status'] == 'running'])} 実行中, {len([p for p in processes if p['status'] == 'sleeping'])} 待機中,   0 停止中,   0 ゾンビ", style="bold")
        console.print(f"CPU(%) : [cyan]{sum(cpu_percent)/len(cpu_percent):.1f}[/cyan] us,  0.0 sy,  0.0 ni, {100-sum(cpu_percent)/len(cpu_percent):.1f} id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st", style="bold")
        console.print(f"メモリ (MiB): [magenta]{mem_info.total/(1024**2):.1f}[/magenta] 全体, {mem_info.available/(1024**2):.1f} 空き, {mem_info.used/(1024**2):.1f} 使用, {mem_info.cached/(1024**2):.1f} バッファ/キャッシュ", style="bold")
        console.print(f"スワップ (MiB): {swap_info.total/(1024**2):.1f} 全体, {swap_info.free/(1024**2):.1f} 空き, {swap_info.used/(1024**2):.1f} 使用. {mem_info.available/(1024**2):.1f} 利用可能メモリ ", style="bold")
        console.print()

        console.print(f"{'PID':<6} {'名前':<25} {'メモリ(MiB)':<15} {'CPU(%)':<10}", style="underline")
        for p in processes[:10]:
            console.print(f"{p['pid']:<6} {p['name']:<25} {p['memory_info'].rss/(1024**2):<15.1f} {p['cpu_percent']:<10.1f}")

        time.sleep(2)
        console.clear()

if __name__ == "__main__":
    display_top()
#python3 topwakaru.py

カラフルで、日本語のわかりやすい表示ができましたね。

他のコマンドも作成してみた

from rich.console import Console
import psutil
import time
import datetime

console = Console()

def display_top():
    search_query = input("検索するプロセス名を入力してください (全て表示する場合は空白のまま Enter): ")

    while True:
        # プロセスの情報を取得して検索クエリでフィルタリング
        processes = []
        for process in psutil.process_iter(['pid', 'name', 'memory_info', 'cpu_percent', 'status']):
            if search_query.lower() in process.info['name'].lower():
                processes.append(process.info)

        processes.sort(key=lambda x: x['cpu_percent'], reverse=True)

        # 結果を表示
        console.clear()
        console.print(f"検索クエリ: [yellow]{search_query if search_query else 'None'}[/yellow]", style="bold")
        console.print(f"{'PID':<6} {'名前':<25} {'メモリ(MiB)':<15} {'CPU(%)':<10}", style="underline")

        for p in processes:
            console.print(f"{p['pid']:<6} {p['name']:<25} {p['memory_info'].rss/(1024**2):<15.1f} {p['cpu_percent']:<10.1f}")

        time.sleep(2)

if __name__ == "__main__":
    display_top()

上記のコードは、先程と同じような手順で作成しました。

こちらのコードを利用することで、調べたいプロセスを入力することで調べることができるコマンドを作成することができます。

このように、ChatGPTを活用することで、自分好みのオリジナルコマンドコマンドを簡単に作る事ができます。

コマンドを覚えるのではなく作る時代はもうすぐかもしれませんね。

この記事をシェアする

  • facebook
  • twitter
  • hatena
  • line
URLとタイトルをコピーする

実績数30,000件!
サーバーやネットワークなど
ITインフラのことならネットアシストへ、
お気軽にご相談ください