Shell
為什麼通過 at 呼叫 dzen2 不工作?
dzen2是一種通知實用程序。此命令將在螢幕上顯示“Hi”的通知:
echo Hi | dzen2 -p
Debian 的at是一個用於安排未來發生的事件的實用程序。此命令將使文件“foo”在 1 分鐘後出現在您的使用者目錄中:
echo "touch ~/foo" | at now + 1 minute
那麼為什麼這個命令不會
dzen2
在 1 分鐘後導致出現通知呢?echo "echo Hi | dzen2 -p" | at now + 1 minute
我已經調查了幾個小時,似乎找不到這不起作用的原因!我有一種預感,它與 at 呼叫的 shell 有關,但我只是不明白為什麼它會失敗。作為一個對立的例子,這個命令工作得很好:
echo "notify-send Hi" | at now + 1 minute
構成
at
作業的程序是atd
(在daemon)程序的子程序,而不是您執行的 shell的子程序at
。所以它不會繼承目前 shell 的環境。系統at
安排複製環境(以及工作目錄和一些更晦澀的東西),但它省略了一些變數。特別是,
DISPLAY
變數不會復製到 at 作業。這個變數告訴所有 X 程序要連接到哪個顯示器。沒有 X 顯示器,dzen2 不知道在哪裡彈出通知。At 刪除DISPLAY
,因為它通常用於批處理作業,不會產生任何終端或圖形輸出。
notify-send
工作,因為它不連接到 X 伺服器:它使用D-bus連接到附加到您的 X 會話的守護程序。
DISPLAY
您可以通過顯式複制變數來使 dzen2 工作:echo "export DISPLAY=$DISPLAY;" 'echo hello | dzen2 -p' | at now + 42 minutes
dzen2 很可能會產生錯誤消息(標準消息是
Can't open display:
)。at 作業產生的任何輸出或錯誤消息都由本地郵件發送(與 cron 作業完全相同)。檢查您的本地郵件。