从crontab运行Python脚本
我有一个Python程序,它通过crontab运行,运行得很好。不过,我决定加一个功能,让它能通知我正在做什么,结果它就出问题了。这个程序在命令行下可以正常运行,但作为crontab程序运行时却失败了。
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\" "
4 个回答
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
2
你正在尝试运行一个需要用户资源的脚本,但在你所处的环境中,这些资源并不存在。如果你想让这个脚本正常工作,就必须去掉脚本中所有与PyGTK和会话总线相关的内容。
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\" "
根据一个建议,这里有个解释,不过这不是我写的。