我最近一直在与crontab战斗,因为在Intrepid中gconftool使用dbus后端,这意味着当从crontab使用它时它不起作用。
为了使其工作,我必须在登录时导出相关的环境变量,以便在cron运行时找到dbus会话地址。
出于好奇,我想知道cron 可以看到什么环境,结果证明我拥有的是HOME
,LOGNAME
,PATH
,{{1 {},SHELL
和我这个新的CWD
。这看起来好奇,几个谷歌搜索引发了一些错误或涉及它的其他功能请求,但没有告诉我它做了什么。
我的直觉是,这个变量可用于查找我必须导出到cron作业运行之前我所源文件的所有内容。
因此,我的问题是a)我可以吗? b)如果是这样,怎么样?和c)它做了什么(或其他)?
全部谢谢
答案 0 :(得分:6)
这非常有趣。我发现是显示管理器设置了一个cookie。那个可用于注册属于“会话”的进程,这些进程由名为ConsoleKit
的守护进程管理。这是为了支持快速用户切换。我的KDE4.2.1系统显然也支持它。
阅读this 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-launch
的文档说libdbus
会自动找到正确的DBUS总线地址。例如,文件存储在/home/js/.dbus/session-bus
中,其中包含正确的当前dbus会话地址。