我有一个用 python 编写的非常简单的脚本,用于测试我的互联网连接,并将解析的数据保存到 json 文件中:
#!/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,当我安排它每分钟运行一次时(数据保存到 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 日志输出还表明您向我们展示的命令实际上并不是您正在运行的命令(其中一个重定向为标准输出到日志文件,另一个则没有)。两者都缺少重定向标准错误。
您可以在系统记录器中捕获输出:
捕获程序的输出,包括写入的错误标准错误:
@hourly /home/trendkiller/python/py_speedtest/main.py 2>&1 | logger -t py_speedtest -p user.info
读取日志文件(可能
grep py_speedtest /var/log/user.log
)
或者,如果您没有运行系统记录器,例如rsyslog
您可能更愿意将输出写入文件。但请记住经常截断该文件,或者在每次程序运行时替换它(使用>
而不是>>
)而不是附加到它。
捕获程序的输出,包括写入的错误标准错误:
@hourly ( date; /home/trendkiller/python/py_speedtest/main.py )>"$HOME/.py_speedtest.log" 2>&1
读取日志文件(例如
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