我正在尝试获取我的 Raspberry Pi 的 CPU 使用率,如下所示:
def get_cpu_usage():
return os.popen("top -n1 | awk '/Cpu\(s\):/ {print $2}'").readline().strip()
正常执行时,此方法会返回正确的用法,例如“7.2”。但是,从 cron 调用时,它会返回一个空字符串。
我的 crontab 如下所示:
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
* * * * * python /home/pi/sysinfo/dashboard.py
我究竟做错了什么?
答案1
通常,当某些操作在通过 cron 运行时没有按照计划进行,但在终端中尝试时却运行良好时,问题可能是由以下两种可能的原因之一引起的:
- cron 没有您习惯或期望的 $PATH(或更一般地说,环境)。只需指定所有内容的完整路径,在 cron 内部或通过 cron 启动的脚本中设置任何适当的环境变量,即可在一定程度上解决这个问题,该脚本可以在运行实际命令之前执行任何必要的设置。
- cron 不通过 TTY 运行命令。如果运行命令时没有附加 TTY,许多命令都不会关心 TTY,而是返回到合理的输出格式,但有些命令会关心 TTY。
top
默认情况下会关心 TTY,必须告知它不关心。我不知道 Python 是否os.popen()
分配了 TTY,但我有点怀疑。
-b
在您的特定情况下,您可以通过将参数添加到 来解决问题top
。如手册页中所述:
-b :批处理模式操作
以“批处理”模式启动 top,这对于将 top 的输出发送到其他程序或文件非常有用。在此模式下,top 将不接受输入并运行,直到达到您使用“-n”命令行选项设置的迭代限制或被终止。
答案2
您可能需要PYTHONPATH
向文件添加一个变量- 您的语句(我假设它位于文件顶部)crontab
可能不起作用。您必须检查机器上的确切目录,但它应该类似于您使用的 Python 版本的位置。import os
dashboard.py
/usr/local/lib/pythonX.X/
X.X