Cron、Python、ファイルに保存

Cron、Python、ファイルに保存

インターネット接続をテストし、解析されたデータをjsonファイルに保存するPythonで書かれた非常に単純なスクリプトがあります。

#!/usr/bin/python3
import subprocess, json, os
from datetime import datetime

# run the bash script and parse results
def speedtest():
    result = subprocess.run(["/bin/speedtest-cli", "--simple"], stdout=subprocess.PIPE, encoding="UTF-8").stdout
    # result = os.system("speedtest-cli --simple")
    download_str = result.find("Download: ") + 10
    download_speed = result[download_str:result.find(" Mbit/s", download_str)]
    upload_str = result.find("Upload: ") + 8
    upload_speed = result[upload_str:result.find(" Mbit/s", upload_str)]
    ping_str = result.find("Ping: ") + 6
    ping = result[ping_str:result.find(" ms", ping_str)]
    return download_speed, upload_speed, ping

def save_to_json(data):
    # load existing data to a dict
    existing_data = []
    with open("/home/trendkiller/development/python/py_speedtest/data.json") as fp:
        existing_data = json.load(fp)
   
    payload = {
        "date": datetime.now().strftime("%d/%m/%Y"),
        "time": datetime.now().strftime("%H:%M"),
        "download": data[0] + " Mbps",
        "upload": data[1] + " Mbps",
        "ping": data[2] + " ms"
    }
    
    existing_data.append(payload)

    # save to a json file
    with open("/home/trendkiller/development/python/py_speedtest/data.json", "w") as f:
        json.dump(existing_data, f, indent=4)

def main():
    test_result = speedtest()
    # save to a json_file
    save_to_json(test_result)
    return 0

if __name__ == "__main__":
    main()

端末から呼び出すとスムーズに実行されます。毎時間接続をテストできるように自動化したいと思います。このためにCRONを試してみて、1分ごとに実行するようにスケジュールすると機能します(データはdata.jsonに保存されます)。しかし、毎時間実行しようとすると、データはjsonファイルに渡されません。これは私のcrontabファイルです。

@hourly /bin/python3 /home/trendkiller/python/py_speedtest/main.py

これを見るとgrep "CRON" /var/log/syslog 変なことはありません(私の知る限り)。

Feb  5 08:00:01 home-lab CRON[119326]: (trendkiller) CMD (/bin/python3 /home/trendkiller/development/python/py_speedtest/main.py > /home/trendkiller/development/python/py_speedtest/log.txt)
Feb  5 08:00:04 home-lab CRON[119325]: (CRON) info (No MTA installed, discarding output)
Feb  5 08:17:01 home-lab CRON[119719]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Feb  5 09:00:01 home-lab CRON[120590]: (trendkiller) CMD (/bin/python3 /home/trendkiller/development/python/py_speedtest/main.py > /home/trendkiller/development/python/py_speedtest/log.txt)
Feb  5 09:00:02 home-lab CRON[120589]: (CRON) info (No MTA installed, discarding output)
Feb  5 09:17:01 home-lab CRON[120798]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)

どんな助けでもとても役に立ちます。よろしくお願いします(そして汚れたコードは気にしないでください:P)。

答え1

まず、プログラムを実行可能にして(chmod u+x /home/trendkiller/python/py_speedtest/main.py)、最初の行に有効なPythonインタプリタがあることを確認してください。 cronコマンドはこれを提案します#!/bin/python3が、すでに作成しました#!/usr/bin/python3。どちらが正しいですか?

CRONログ出力は、表示されるコマンドが実際に実行されているコマンドではないことを示します(リダイレクトの1つは次のとおりです)。標準出力ログファイルに保存されますが、他のファイルには保存されません)。どちらもリダイレクトがありません。標準エラー

システムロガーから出力をキャプチャできます。

  1. 作成されたエラーを含むプログラムの出力をキャプチャします。標準エラー:

    @hourly /home/trendkiller/python/py_speedtest/main.py 2>&1 | logger -t py_speedtest -p user.info
    
  2. ログファイルを読む(おそらくgrep py_speedtest /var/log/user.log

または、たとえば、システムロガーを実行しない場合は、rsyslog出力をファイルに書き込むことをお勧めします。ただし、プログラムが実行されるたびにファイルを追加するのではなく、常にファイルを切り捨てるか置き換える(>代わりに使用)ことを忘れないでください。>>

  1. 作成されたエラーを含むプログラムの出力をキャプチャします。標準エラー:

    @hourly ( date; /home/trendkiller/python/py_speedtest/main.py )>"$HOME/.py_speedtest.log" 2>&1
    
  2. ログファイルの読み取り(例less "$HOME/.py_speedtest.log":)

私はあなたがいると思うディレクトリにない可能性が最も高いと思います。もしこの場合、$HOMEディレクトリを変更して問題を解決できます。例えば、

@hourly cd && ( date; /home/trendkiller/python/py_speedtest/main.py )>".py_speedtest.log" 2>&1

(ホームディレクトリがある場合は、/home/trendkillerコマンドから削除することもできますpython/py_speedtest/main.py。:)

答え2

迅速な答え:

でスクリプトを作成してください/etc/cron.hourly

runpyスクリプト:

#!/bin/bash
/bin/python3 /home/trendkiller/python/py_speedtest/main.py

その後、実行可能にします。

sudo chmod +x /etc/cron.hourly/runpy

以下を使用--reportまたはテストします--test

run-parts --report /etc/cron.hourly

マンページ。

関連情報