我有一个通过 cron 运行的脚本来更改桌面墙纸。我可以通过导出 DISPLAY 变量来让它工作。
但是我担心脚本应该适用于所有系统的问题。如何在不使用 $DISPLAY 的情况下找到 X 服务器设置的 DISPLAY 值?
那么我怎样才能以DISPLAY编程方式找到正确的值。我只能在DISPLAY=:1. 将其设置为":0"使脚本退出
No protocol specified
Cannot open display.
Run Code Online (Sandbox Code Playgroud)
你不能肯定。你必须做出假设。
假设您正cron面临最坏的情况:有多个用户登录,每个用户运行多个 X 会话。您必须猜测用户(很容易,我们正在执行他们的 crontab)和该用户的 X 会话之一。
如果我们想假设用户从 tty 运行一个且只有一个 X 会话,并获取该会话的$DISPLAY值,我们可以使用w:
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
user tty1 16:32 7:15 0.21s 0.19s -zsh
user tty2 :1 15:52 48:13 2:17 0.08s /sbin/upstart
user pts/3 :1 16:19 0.00s 0.66s 0.00s w
Run Code Online (Sandbox Code Playgroud)
例如,这里我登录到 tty1、tty2(我在其中运行 X 会话)和 pts/3(我运行命令的终端)。
稍微解析一下:
% w $(id -un) | awk 'NF > 7 && $2 ~ /tty[0-9]+/ {print $3; exit}'
:1
Run Code Online (Sandbox Code Playgroud)
所以,假设以上所有:
0 0 * * * DISPLAY=$(w $(id -un) | awk 'NF > 7 && $2 ~ /tty[0-9]+/ {print $3; exit}') command
Run Code Online (Sandbox Code Playgroud)
将cron执行command与$DISPLAY设置为一个tty的运行第一个X会话$DISPLAY发现用户价值。