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. 작성된 오류를 포함하여 프로그램의 출력을 캡처합니다.표준 에러:

    @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

맨페이지.

관련 정보