![从 crontab 运行 GUI 终端](https://linux22.com/image/1706346/%E4%BB%8E%20crontab%20%E8%BF%90%E8%A1%8C%20GUI%20%E7%BB%88%E7%AB%AF.png)
我一直试图通过 来打开 GUI 中的终端crontab
。这问题描述它无法完成,因为桌面和 crontab 单独运行。有没有办法让我可以从 crontab 触发脚本,但稍后将该父进程附加到显示器?
我之所以问这个问题,是因为我有多个脚本需要运行几个小时,我想监控它们并在触发某些事件时在终端中提供输入。我尝试导出变量DISPLAY=:0.0
,然后从 crontab 运行终端,但大多数情况下它都会显示类似 的内容Can't find the Display at :0.0
。
我crontab
在桌面会话中使用同一个用户。
谢谢
答案1
您需要让您的桌面存储有关其正在运行的显示器的信息 - 当您登录时,它需要将必要的环境变量的值存储在您的 cron 作业能够读取的某个地方。
(例如,通过~/.xprofile
if 仍然有效,或者通过从 运行脚本~/.config/autostart/
。)
最重要的环境变量是:
DISPLAY
XAUTHORITY
XDG_RUNTIME_DIR
DBUS_SESSION_BUS_ADDRESS
还有其他因素可能会影响桌面应用程序的行为。因此,对于 Ubuntu,最简单的方法可能是使用 systemd 来实现这一点——事实上,许多桌面组件已经像 cron 作业一样运行,不是主“桌面会话”进程树的一部分,而是通过“systemd --user”进程分离,桌面环境已经将环境变量存储在那里。
您可以使用systemd-run
它通过用户的 systemd 实例启动程序。这样,您只需要设置单个 XDG_RUNTIME_DIR(它是一个静态值,因此您可以在 crontab 中对其进行硬编码 - 与更动态的 DISPLAY 不同),并且启动的进程将具有与您的桌面应用程序相同的环境变量。
XDG_RUNTIME_DIR=/run/user/YOURUID
@hourly systemd-run --user --quiet --collect xterm
答案2
不建议直接从 crontab 调用 GUI 终端,因为这违背了 的目的cron
。
然而,仅就您的目标而言,我会考虑:
$DISPLAY
选项 1:在 cron 作业中找到变量的值,并在调用 GUI 终端之前进行设置
选项 2:如果您需要输入,请将所需的信息/变量存储在文件中,稍后您可以在 cron 作业脚本中提取该值。您可以使用脚本目录(例如<script_dir>/.tmp
)或用户登录脚本(例如~/.profile
或~/.bashrc
)