2010-07-21 193 views
3

我有一个通过crontab运行的python程序,并且完美地工作。但是,我决定增加通知我它正在做什么的能力,并突然失败。它从命令行运行,但是,运行它作为crontab程序导致它失败从crontab运行python脚本

libnotify-Message: Unable to get session bus: /bin/dbus-launch terminated abnormally with the following error: Autolaunch error: X11 initialization failed. 

我在做什么错?

编辑 我想这个程序仍然可以从cron运行,并能够利用通知用户它的工作。有没有办法做到这一点?

编辑2 我用root的crontab和sudo -u esr python script.py试过没这也失败了,默默地在那。

编辑3 这是可能的!这是代码。

* * * * * su $user -c "DBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$(ps -au esr | grep -i "gnome-session" | awk '{ print $1 }')/environ | sed -e 's/DBUS_SESSION_BUS_ADDRESS=//') $(whereis notify-send | awk '{ print $2 }') -u normal -t 20000 \"Hello\" " 
+0

你可以使用'的sendmail '通知用户程序的结果。 – 2010-07-21 18:02:48

+0

sendmail可以工作,但它与使用日志来存储结果一样有效,这不幸并不是我正在寻找的。 – EricR 2010-07-21 18:03:40

回答

4
* * * * * su esr -c "DBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$(ps -au esr | grep -i "gnome-session" | awk '{ print $1 }')/environ | sed -e 's/DBUS_SESSION_BUS_ADDRESS=//') $(whereis notify-send | awk '{ print $2 }') -u normal -t 20000 \"Hello\" " 

由于每一个建议,an explanation,可惜不是我

+0

我认为如果你能解释这一行的每一部分以及它的作用,对其他人会有所帮助。 – 2010-07-22 14:59:10

+0

肯定的事,做完了。 – EricR 2010-07-22 21:42:14

1

您正在尝试为无法访问图形终端的cron程序使用GUI(GTK +库调用)。当你从cron运行它时,你需要避免创建对话框和窗口。

2

您正试图运行一个需要用户资源的脚本,该脚本在所述资源不可用的环境中运行。如果你想要这个工作,你将不得不删除所有对PyGTK的引用的脚本和会话总线。

+2

这是有道理的,但我想利用通知,有没有办法从crontab做到这一点? – EricR 2010-07-21 17:58:08

2

我只是想提的是,以下几招作品为真棒窗口管理器的用户:

*/1 * * * * DBUS_SESSION_BUS_ADDRESS=$(grep -zi DBUS /proc/$(pgrep awesome)/environ | sed -r -e 's/^DBUS_SESSION_BUS_ADDRESS=//') DISPLAY=":0.0" notify-send -t 0 blah blah