「CPU高負荷状態対策」 linux編 | 不惑のクワガタ日記

不惑のクワガタ日記

はじめた当初はクワガタの日記だったのですが、、、
現在は人工知能と戯れる日記になってます。

 

のつづき

 

(私)
ちなみに、これをUbuntuでpythonで実装するとするとどんな感じですか? 

(chatGPT)
QUE.csvから1行とって実行してその行を削除みたいな感じ。
UbuntuでPythonを使用して、CSVファイルからジョブを読み取り、実行し、その行を削除するアプリケーションを作成する場合、以下のような手順で実装できます。

必要なライブラリをインポートします。

import csv
import os
import subprocess
import shutil

CSVファイルからジョブを読み取る関数を作成します。

def read_job_from_csv(file_path):
    with open(file_path, 'r') as f:
        reader = csv.reader(f)
        job = next(reader)
    return job

ジョブを実行する関数を作成します。

def execute_job(job):
    command = job[0]
    args = job[1:]
    subprocess.run([command, *args])

実行済みのジョブをCSVファイルから削除する関数を作成します。

def remove_executed_job(file_path):
    temp_file_path = f"{file_path}.tmp"
    with open(file_path, 'r') as f, open(temp_file_path, 'w') as temp_f:
        reader = csv.reader(f)
        writer = csv.writer(temp_f)
        next(reader)  # スキップ
        for row in reader:
            writer.writerow(row)
    shutil.move(temp_file_path, file_path)

これらの関数を使って、ジョブを読み取り、実行し、削除するメイン関数を作成します。

def main():
    csv_file_path = "QUE.csv"
    job = read_job_from_csv(csv_file_path)
    execute_job(job)
    remove_executed_job(csv_file_path)

if __name__ == "__main__":
    main()

このPythonスクリプトを実行すると、QUE.csvファイルからジョブを読み取り、実行し、その行を削除します。ただし、このスクリプトは1回の実行で1つのジョブを処理します。ジョブを継続的に処理する場合は、ループを追加するか、スケジューリングツール(例えば、cron)を使用して、定期的にスクリプトを実行するように設定してください。


(私)
Linux で、デーモンプログラムにするには、どうすれば良いのですか?

(chatGPT)
Linuxでデーモンプログラムを作成するには、通常、次の手順に従います。

プログラムの実行をバックグラウンドで開始する。
プログラムを親プロセスから切り離す。
カレントディレクトリをルートディレクトリに変更する。
ファイル作成マスクをリセットする。
標準入力、標準出力、標準エラーをクローズまたはリダイレクトする。
Pythonでデーモンプログラムを作成するには、以下のような実装が可能です。

import os
import sys
import time

def create_daemon():
    pid = os.fork()
    
    if pid > 0:
        # 親プロセスは終了
        sys.exit()

    if pid == 0:
        # 子プロセスがデーモンになる
        os.setsid()  # 新しいセッションを作成
        os.chdir('/')  # カレントディレクトリをルートに変更
        os.umask(0)  # ファイル作成マスクをリセット

        # 標準入出力エラーを/dev/nullにリダイレクト
        sys.stdin.close()
        sys.stdout.close()
        sys.stderr.close()

        # デーモンとして実行する処理
        main_loop()

def main_loop():
    while True:
        # ここでデーモンとして実行したい処理を記述
        time.sleep(10)  # 10秒ごとにループ

if __name__ == "__main__":
    create_daemon()

このスクリプトは、デーモンプロセスを作成し、main_loop() 関数をバックグラウンドで実行します。この関数内に、デーモンとして実行したい処理を実装してください。

また、Pythonでデーモンプログラムを簡単に作成するためのライブラリもいくつか存在します。例えば、python-daemonというライブラリを利用すると、デーモン化の手順を簡単に実装できます。このライブラリを使用するには、まずインストールが必要です。

pip install python-daemon

その後、以下のようにコードを書くことでデーモンプログラムを作成できます。

import daemon
import time

def main_loop():
    while True:
        # ここでデーモンとして実行したい処理を記述
        time.sleep(10)  # 10秒ごとにループ

if __name__ == "__main__":
    with daemon.DaemonContext():
        main_loop()
 

これにより、main_loop()関数内の処理がデーモンプロセスとしてバックグラウンドで実行されます。python-daemonライブラリを使用することで、簡単にデーモンプログラムを作成できるのが分かります。

この方法を使用して、Pythonプログラムをデーモンプロセスとして実行し、バックグラウンドでジョブを処理することができます。ただし、デーモンプロセスは通常のプロセスとは異なるため、エラーハンドリングやログ出力に注意して実装してください。


(私)
pythonで、現在のCPU使用率を取得する方法を教えてください。

(chatGPT)
Pythonで現在のCPU使用率を取得するには、psutilというライブラリを使用できます。まず、psutilをインストールする必要があります。

pip install psutil
 

インストールが完了したら、以下のコードを使用してCPU使用率を取得できます。

import psutil

# CPU使用率を取得(パーセント単位)
cpu_percent = psutil.cpu_percent()
print(f"CPU使用率: {cpu_percent}%")
 

psutil.cpu_percent()関数は、システム全体のCPU使用率をパーセント単位で返します。また、各CPUコアの使用率を取得したい場合は、psutil.cpu_percent(percpu=True)を使用して、各コアの使用率をリストで取得できます。

import psutil

# 各CPUコアの使用率を取得(パーセント単位)
cpu_percent_per_core = psutil.cpu_percent(percpu=True)

print(f"CPUコアごとの使用率: {cpu_percent_per_core}")
 

これにより、Pythonを使用して現在のCPU使用率を簡単に取得できます。これを利用して、CPU負荷に応じた処理制御やモニタリングなどを実装できます。