我找到了关于此问题的类似帖子,并且总是通过到处指定完整路径来解决。我已经这样做了,但仍然不起作用。
我编写了一个 python 脚本,用于检查笔记本电脑的电池充电状态。我希望它每分钟检查一次,并在状态不是“空闲”时通知我。我添加了一个额外的位,用于记录脚本运行时的情况;该位仅用于帮助调试我在 crontab 不运行脚本时遇到的问题。
我的脚本是这样的:
#!/usr/bin/python3
import os
from datetime import datetime
date_time = datetime.now().strftime("%d/%m/%Y, %H:%M:%S")
output = os.popen('sudo /usr/bin/tlp-stat -s -c -b | /usr/bin/grep "BAT0/status"').read().split('=')[1].strip()
if not output == 'Idle':
os.system('/usr/bin/notify-send -u critical "Battery not on idle"')
with open('/home/admin/batteryLog.txt','a') as f:
f.write(output + ": " + date_time+"\n")
我使用这个脚本添加到 crontab 中crontab -e
,它看起来像这样:* * * * * /usr/bin/python3 /home/admin/checkBattery.py
人们这里建议使用env -i /bin/bash --noprofile --norc
来获取 crontab 使用的 bash 环境。我的脚本在这里运行良好,所以我不知道是什么原因导致它无法在 crontab 中运行。
我已经运行chmod a+x
了 python 脚本,我添加了 shebang#!/usr/bin/python3
以防万一。我尽可能地在所有地方都包含了完整路径,但我不认为问题出在路径上,因为它在 noprofile 环境中运行良好。
我还读到人们建议cd
在 crontab 中使用将目录更改为 python 脚本的位置,但我的脚本位于根目录中,因此这样做没有用。
我已经跑了which python3
,它又回来了/usr/bin/python3
,所以我肯定也在正确的位置。
还有人知道我还可以在这里尝试什么吗?
答案1
所以我花了整整一周的时间才修复它。但现在我已经修复了。以下是我所做的。
有两个不同的问题。正如@steeldriver 所说,如果不指定显示的详细信息,notify-send 无法从 crontab 运行。我将该行更改为export XDG_RUNTIME_DIR=/run/user/1000; /usr/bin/notify-send -u critical "Battery Not on Idle" ""
另一个问题是 /usr/bin/tlp-stat -s -c -b。我无法获得正确的权限以使其在 crontab 中运行。但是,它确实以 root 身份在 crontab 中运行,由 访问sudo crontab -e
。但是……以 root 身份运行会导致通知发送停止工作。我花了好几天的时间摆弄,但最终我不得不编写两个 bash 脚本,一个用于sudo crontab -e
获取电池状态并使用 echo 输出到文本文件;另一个 cronjob 用于crontab -e
读取输出文件并在状态不是空闲时显示消息。