如何在未设置 DISPLAY 时以编程方式查找 DISPLAY 的当前值?(在 crontab 中使用)

Ash*_*san 6 xorg bash cron

我有一个通过 cron 运行的脚本来更改桌面墙纸。我可以通过导出 DISPLAY 变量来让它工作。

但是我担心脚本应该适用于所有系统的问题。如何在不使用 $DISPLAY 的情况下找到 X 服务器设置的 DISPLAY 值?

那么我怎样才能以DISPLAY编程方式找到正确的值。我只能在DISPLAY=:1. 将其设置为":0"使脚本退出

No protocol specified
Cannot open display.
Run Code Online (Sandbox Code Playgroud)

kos*_*kos 8

你不能肯定。你必须做出假设。

假设您正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发现用户价值。

  • @AshharHasan 我也这么认为。也许您应该妖魔化一个脚本并让它完成任务,它看起来既简单又可靠。 (2认同)