如何使用 Crontab 在 DISPLAY=:0.0 上向用户显示某些内容或运行 GUI 程序

如何使用 Crontab 在 DISPLAY=:0.0 上向用户显示某些内容或运行 GUI 程序

我真的很希望能够使用 crontab 每 3 小时更新一些内容,但是 crontab 不会以足够的权限运行我的脚本来运行 GUI。

澄清:我有一个复杂的脚本,每 3 小时生成一张图片(基于来自几个服务器的当前可用的网络内容) - 我想让它显示它正在做什么,这样我才知道它是否失败了。

我尝试过:1. 将文件添加到 /etc/cron.d/myscript 以便 cron 运行 2. xdg-open、gnome-terminal、mrxvt -e、env DISPLAY=:0.0、root /usr/local/bin/myscript 的变体 3. 编辑我的用户 cron -- crontab -u username -e

Myscript 是一个复杂的小东西,它可以下载一张图片(每半小时更新一次),然后下载一个不同的网站网页作为 index.html - 使用 sed 找到它所需的特定图像(基于今天的日期和时间),然后使用 imagemagick 裁剪并转换它。

答案1

man xauth
man xhost

你可以xhost local:作为开始尝试一下。

答案2

如果您想在用户桌面上打开一个窗口,您需要从用户上下文中导出 X11 身份验证信息并将其提供给您的根上下文。

作为用户,导出 xauth 信息:

$ xauth extract /home/foo/xauth-foo $DISPLAY
$ echo $DISPLAY
:0.0

然后,以 root 身份导入它并启动你的 X 客户端:

# xauth merge /home/foo/xauth-foo
# export DISPLAY=:0.0
# xclock

从我的笔记来看,这尚未经过测试。至少 5 年来我都没有使用过它。

答案3

我其实刚刚问过这个问题我自己在得到一些指导后设法回答了这个问题(来源1&来源2)。但是,这是针对树莓派的,所以您可能需要使用其他命令。

gnome-terminal -e command

xterm -e command

konsole -e command

terminal -e command

lxterminal -e command

通过使用命令lxterminal -e command,我可以让终端打开一个新窗口。但这并不是全部需要做的事情。指定路径而不是依赖 crontab 中的环境变量……我已经在使用,PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin所以我就用了这个。然后创建一个在 crontab 中使用的简单脚本,它会调用另一个脚本。

#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
export DISPLAY=:0.0
lxterminal -e /home/pi/Public/./test

Crontab(命令 crontab -e)最终看起来像......

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
* * * * * /home/pi/Public/test2

这调用了最终的脚本测试。

#!/bin/bash
echo 'This is a test.'
echo 'This is a written test with lxterminal -e for real.' >> /home/pi/Public/testwrite.txt
sleep 10

相关内容