为什么我的 python 脚本没有运行 crontab?所有内容都有完整路径,但仍然不起作用

为什么我的 python 脚本没有运行 crontab?所有内容都有完整路径,但仍然不起作用

我找到了关于此问题的类似帖子,并且总是通过到处指定完整路径来解决。我已经这样做了,但仍然不起作用。

我编写了一个 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读取输出文件并在状态不是空闲时显示消息。

相关内容