6

我最近一直在使用 crontab,因为在 Intrepid 中,gconftool 使用 dbus 后端,这意味着从 crontab 中使用时它不起作用。

为了使它工作,我必须在登录时导出相关的环境变量,以便在 cron 运行时找到 dbus 会话地址。

出于好奇,我想知道 cron可以看到什么环境,结果发现我只有HOME, LOGNAME, PATH, SHELL,CWD以及我身上的这个新环境, XDG_SESSION_COOKIE. 这看起来很奇怪,一些谷歌搜索已经提出了一些涉及它的错误或其他功能请求,但没有任何东西告诉我它做了什么。

我的直觉是,这个变量可用于查找在 cron 作业运行之前我必须导出到源文件的所有内容。

因此,我的问题是 a) 我可以吗?b) 如果是,怎么做?c) 它有什么(其他)作用?

谢谢大家

4

1 回答 1

6

这很有趣。我发现这是显示管理器设置了一个 cookie。它可以用于注册进程以属于一个“会话”,该会话由一个名为ConsoleKit. 即支持快速用户切换。我的 KDE4.2.1 系统显然也支持它。

阅读这个fedora wiki 条目。

所以这个环境变量就像DBUS_SESSION_BUS_ADDRESS授予对某些实体的访问权限(在XDG_SESSION_COOKIE由 ConsoleKit 管理的登录会话的情况下)。例如,有了该环境变量,您可以向经理询问您当前的会话:

$ dbus-send --print-reply --system --type=method_call \
    --dest=org.freedesktop.ConsoleKit \
    /org/freedesktop/ConsoleKit/Manager \
    org.freedesktop.ConsoleKit.Manager.GetCurrentSession

method return sender=:1.1 -> dest=:1.34 reply_serial=2
   object path "/org/freedesktop/ConsoleKit/Session1"
$

Manager 还支持查询某个进程所属的会话

$ [...].Manager.GetSessionForUnixProcess uint32:4494

method return sender=:1.1 -> dest=:1.42 reply_serial=2
   object path "/org/freedesktop/ConsoleKit/Session1"

但是,它没有列出或以某种方式包含与某些cron工作相关的变量。但是,文档dbus-launchlibdbus会自动找到正确的 DBUS 总线地址。例如,文件存储在/home/js/.dbus/session-bus其中包含正确的当前 dbus 会话地址。

于 2009-03-10T22:43:35.620 回答