如何在取消设置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