如何在取消设置DISPLAY时以编程方式查找DISPLAY的当前值? (用于crontab)

我有一个通过cron运行的脚本来更改桌面壁纸。 我可以通过导出DISPLAY变量来实现它。

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

那么如何以编程方式为DISPLAY找到正确的值。 我只有在DISPLAY=:1时才能使它工作。 将其设置为":0"使脚本退出

 No protocol specified Cannot open display. 

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

假装你是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.00sw 

例如,我在tty1上登录,在tty2(我正在运行X会话)和pts / 3(我正在运行命令的终端)登录。

通过一些解析:

 % w $(id -un) | awk 'NF > 7 && $2 ~ /tty[0-9]+/ {print $3; exit}' :1 

所以,假设以上所有:

 0 0 * * * DISPLAY=$(w $(id -un) | awk 'NF > 7 && $2 ~ /tty[0-9]+/ {print $3; exit}') command 

将使用$DISPLAY设置的cron执行command设置为在为用户找到的tty的$DISPLAY值中运行的第一个X会话。

有关更详细的讨论,请参阅https://unix.stackexchange.com/questions/17255/is-there-a-command-to-list-all-open-displays-on-a-machine

我将在此处列出该答案的相关信息:

似乎有两种简单的方法可以找到系统上运行的X服务器实例。

  • w
    w命令列出所有打开的显示。 然后,您可以使用awk过滤掉所需的信息。 FROM下的值是与DISPLAY对应的值。

     ashhar@xenon:[/tmp/.X11-unix]🍷🍸 $ w 21:18:24 up 3:39, 4 users, load average: 0.31, 0.27, 0.30 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT ashhar tty2 :1 17:40 3:39m 6:11 0.08s /usr/bin/dunst ashhar pts/0 :1 17:41 3:36m 0.13s 0.05s vim .i3/config ashhar pts/1 :1 18:07 0.00s 1.44s 0.00sw ashhar pts/2 :1 18:15 9:59 0.79s 0.79s bash 
  • 本地显示对应于/tmp/.X11-unix的套接字,因此我们可以简单地执行:

     cd /tmp/.X11-unix && for x in X*; do echo ":${x#X}"; done