Crontab未在Ubuntu上执行Python脚本

Crontab未在Ubuntu上执行Python脚本,python,ubuntu,cron,crontab,Python,Ubuntu,Cron,Crontab,我有一个包含以下代码的Python脚本: import subprocess import sys default = "Take a 20 second break - look at least 20 feet away!" message = sys.argv[1] if len(sys.argv) > 1 else default def sendmessage(message): subprocess.Popen(['notify-send', message])

我有一个包含以下代码的Python脚本:

import subprocess
import sys

default = "Take a 20 second break - look at least 20 feet away!"
message = sys.argv[1] if len(sys.argv) > 1 else default

def sendmessage(message):
    subprocess.Popen(['notify-send', message])
    return

sendmessage(message)
名为
takebreak.py
,将发送系统通知

当我尝试使用
crontab
将其自动化时,如下所示:

* * * * * /usr/bin/python /home/polo/git-repositories/takebreak/takebreak.py
它不起作用。运行命令

/usr/bin/python /home/polo/git-repositories/takebreak/takebreak.py
在终端中确实可以工作,这意味着这不是文件位置问题,而是与
cron
有关。有什么想法吗

EDIT1:

在调试并查看日志之后,我可以验证cron是否正在实际执行commmand
export DISPLAY=:0/usr/bin/python/home/polo/git repositories/takebreak/takebreak.py
每一分钟都像我设置的那样,但是由于某种原因,这个命令虽然应该发送系统通知,却没有这样做。 有什么想法吗

EDIT2:


解决方案是添加一些地址总线的东西(忘记确切的代码),我在另一篇文章中发现了它,最终解决了它。不幸的是,这里的答案或评论都无助于解决问题,但还是要谢谢你

问题很可能是从
crontab
运行时,
notify send
不在
$PATH
中。首先,找出它的存储位置:

$ which notify-send
/usr/bin/notify-send
对我来说,它在
/usr/bin

crontab
文件(
crontab-e
)的顶部,设置
$PATH

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
如果要包括以前可能已设置的任何
$PATH
(更安全),请执行以下操作:

PATH="${PATH}:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
如果您的命令未安装在
/usr/bin
中,请确保其中包含安装该命令的目录

当然,另一个选项是在Python脚本中简单地指定完整的命令路径:

subprocess.Popen(['/usr/bin/notify-send', message])

在脚本中指定绝对命令路径不是更好吗?设置crontab路径可能会有副作用。我想说不——那么脚本的可移植性就会降低,因为它取决于libnotify的工具是否安装在指定的位置。我在回答中添加了一个更安全的方法来修改
$PATH
,并将Python脚本更改为使用命令的绝对路径。这两种方法都不起作用,
cat/var/log/syslog | grep crontab
返回(在编辑等操作中)以下行:
Mar 30 19:31:01 polo-cron[634]:(polo)RELOAD(crontab/polo)
让我们尝试将标准错误输出写入文件并查看它。在crontab行的末尾添加
/tmp/cron-error.log 2>&1
,然后查看
/tmp/cron error.log
,看看它是怎么说的。我以前尝试过这个方法,但在等待几分钟后没有出现日志(crontab现在设置为每分钟运行一次)。这可能会有所帮助:我的crontab肯定正在运行,但由于某种原因,该命令无法运行。只需键入导出显示=:0/usr/bin/notify send blah不显示任何内容我很难理解上述代码中的解决方案。我应该在我的主代码中添加一个DBUS\u SESSION\u BUS\u地址?地址是什么?首先,我的建议是运行
env|grep DBUS
并在crontab中对其进行硬编码,就像Will的答案中的
$PATH
一样。这将告诉你它是否解决了问题。如果是的话,在我链接到的答案中,有一些关于如何做的建议。如果它是一个bash脚本,那么就更容易了,您必须找到实现它的最佳方法,要么从Python,要么从某个地方转储环境变量并从crontab使用它。