Cron Jobs可以使用Gnome-Open吗?

时间:2011-11-21 22:12:39

标签: bash cron dbus

我正在运行Ubuntu 11.10(Unity界面),我创建了一个使用'gnome-open'打开我每天早上使用的一系列网页的Bash脚本。当我在终端中手动执行脚本时,bash脚本工作得很好。这是一个脚本示例(它完全相同所以我缩短了它):

#!/bin/bash

gnome-open 'https://docs.google.com';
gnome-open 'https://mail.google.com'; 

由于它似乎运行良好,我在我的crontab(我的,而不是root)中添加了一个作业,以便在特定时间的每个工作日执行。

这是crontab条目:

30 10 * * 1,2,3,4,5 ~/bin/webcheck.sh

问题是在bash脚本中为每个'gnome-open'命令返回此错误:

  

GConf-WARNING **:客户端无法连接到D-BUS守护程序:   如果没有$ DISPLAY for X11,则无法自动启动dbus-daemon   GConf错误:没有D-BUS守护程序正在运行   错误:未指定显示

我做了一些搜索试图弄清楚这一点。我尝试的第一件事是使用SIGHUP重新启动守护进程:

killall -s SIGHUP gconfd-2

这没用,所以我尝试使用dbus-launch手册页中的代码启动dbus-daemon:

## test for an existing bus daemon, just to be safe
         if test -z "$DBUS_SESSION_BUS_ADDRESS" ; then
## if not found, launch a new one
         eval `dbus-launch --sh-syntax --exit-with-session`
         echo "D-Bus per-session daemon address is: $DBUS_SESSION_BUS_ADDRESS"
         fi

但那没有做任何事情。

我尝试在我的bash脚本顶部添加简单的'dbus-launch',但这也不起作用。

我也尝试编辑crontab以包含Bash的路径,因为我在另一个线程上看到了这个建议但是没有用。

关于如何启动并运行的任何想法?

2 个答案:

答案 0 :(得分:3)

问题是如何解决的。事实证明,问题主要是由于Bash无法访问X窗口会话(或者至少是我理解它的方式)。所以通过编辑我的crontab解决了我的问题:

30 10 * * 1,2,3,4,5 export DISPLAY=:0 && ~/bin/webcheck.sh

“export DISPLAY =:0”语句告诉cron使用哪个显示器。在搜索“没有指定显示”之后,我在这个存档的Ubuntu论坛上找到了答案:

http://ubuntuforums.org/archive/index.php/t-105250.html

所以现在,每当我登录时,正好在10:30,我的系统将自动启动一系列我每天需要查看的网页。每次我都要经历艰难的输入我的三个字母别名的过程,这样我就不用了。)

答案 1 :(得分:2)

很高兴你问过!

这取决于它何时运行。

如果Gnome GDM Greeter处于活动状态,您可以使用登录对话框中的DBUS会话。例如,如果没有人登录,您可以使用此功能将通知发送到登录屏幕:

function do_notification
{
    for pid in $(pgrep gnome-session); do
        unset COOKIE
        COOKIE="$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$pid/environ|cut -d= -f2-)"
        GNUSER="$(ps --no-heading -o uname $pid)"

        echo "Notifying user $GNUSER (gnome-session $pid) with '$@'"
        sudo -u "$GNUSER" DBUS_SESSION_BUS_ADDRESS="$COOKIE" /usr/bin/notify-send -c "From CRON:" "$@"
    done

    unset COOKIE
}

正如您所看到的,上面的代码只是在所有可用的gnome-sessions上运行相同的命令(notify-send),如下所示:

do_notification "I wanted to let you guys know"

您可以将它拆开并将其用于您自己的目的。