在 crontab 中執行 xprop:“無法打開顯示”
我剛剛製作了一個執行良好的 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 程序,然後使用
su
orsudo
成為 root 當且僅當$DISPLAY
(並且$XAUTHORITY
,如果需要)傳遞到su
/sudo
會話時,這是可能的 - 這通常設置為預設發生。