Bash

在 crontab 中執行 xprop:“無法打開顯示”

  • October 18, 2019

我剛剛製作了一個執行良好的 Bash 腳本xprop(由普通使用者和 root 執行):

#!/bin/bash
# time tracking BASH script

# current time and date
current_date=$(date --rfc-3339='seconds')

# active window id
window_id=$(xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut --fields 2)

# active window class
wm_class=$(xprop '\t$0\n' -id $window_id WM_CLASS | cut --fields 2)

# active window name
wm_name=$(xprop '\t$0\n' -id $window_id _NET_WM_NAME | cut --fields 2)

echo '"'$current_date'", '$wm_class', '$wm_name

使用以下輸出(以普通使用者和 root 身份執行):

nelson@triplecero:~$ bash-scripts/time-tracking.sh
"2019-10-16 23:28:41-04:00", "konsole", "nelson@triplecero: ~ — Konsole"

該腳本是從普通使用者呼叫的,crontab但它沒有按預期工作,在日誌中寫入錯誤消息:"xprop: unable to open display ''"這是目前會話使用者未執行 xprop(和任何 GUI 程序)時顯示的典型錯誤消息,情況並非如此,因為我可以xprop以 root 使用者身份執行(和任何其他傢伙程序)。

crontab(對於普通使用者)是這樣的:

# m h  dom mon dow   command
 * *    *   *   *   /home/nelson/bash-scripts/time-tracking.sh >> /home/nelson/log/time-tracking.log 2>&1
 * *    *   *   *   window_id=$(xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut --fields 2) 2>&1; echo $window_id >> /home/nelson/log/test.log 2>&1
 

第一行執行時出現以下錯誤消息time-tracking.log

xprop:  unable to open display ''
xprop:  unable to open display ''
xprop:  unable to open display ''
"2019-10-16 23:21:01-04:00", ,

而第二個只是在test.log

我做錯了什麼cron來獲取這些錯誤消息而不是正確的輸出?

您缺少$DISPLAY環境變數。它由初始化 GUI 會話的第一個程序設置,然後由其所有子程序繼承。對於本地 X11 會話,該值通常為:0.

$DISPLAY變數告訴 X11 應用程序如何联系 X 伺服器;該值:0告訴他們使用本地 Unix 套接字/tmp/.X11-unix/X0。初始連接後,可以啟用更高性能的訪問方法,如直接渲染基礎設施 (DRI)。

Cron 作業不會$DISPLAY自動獲取變數,因為它們應該獨立於 GUI 會話執行:如果作業的所有者此時沒有登錄怎麼辦?如果一個 cron 作業可以訪問任何人的 X11 會話,它將使使用者能夠互相監視,這是完全不能接受的。

根據您使用的發行版,您可能還需要設置$XAUTHORITY環境變數。沒有它,所有 X11 工具和應用程序將假定 X11 會話 cookie 位於$HOME/.Xauthority,但作為範例,Debian 10$TMP為每個使用者創建私有目錄,因此$TMP將設置為 DISPLAY/tmp/user/<user's UID number>並將$XAUTHORITY設置為。$TMP/xauth-<user's UID number>-_0``:0

如果無法訪問正確的 X11 會話 cookie,X11 伺服器將不會響應請求,即使是 root 也不響應。以普通使用者身份登錄後執行 GUI 程序,然後使用suorsudo成為 root 當且僅當$DISPLAY(並且$XAUTHORITY,如果需要)傳遞到su/sudo會話時,這是可能的 - 這通常設置為預設發生。

引用自:https://unix.stackexchange.com/questions/547192