Shell

為什麼通過 at 呼叫 dzen2 不工作?

  • May 11, 2012

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 作業完全相同)。檢查您的本地郵件。

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