Cron

如何在根 cron 任務完成後向使用者顯示(zenity/GUI)對話框

  • September 23, 2013

我有一個簡單的定期 cron 任務,必須以 root 身份執行。當 cron 任務完成時,我想使用 Zenity(或類似工具)向使用者 1000(或登錄使用者或所有使用者)顯示 GUI 資訊對話框。

我正在尋找一個簡單、容易、快速的解決方案。我將適應這種簡單解決方案的要求。

這就是我到目前為止的位置。如果手動執行,我的 bash 腳本可以正常工作,但是當 Anacron 執行它時,什麼也沒有發生,我Gtk-WARNING **: cannot open display在日誌中看到了。我希望它會在 cron 執行後向使用者顯示我的對話框。

我意識到(在閱讀相關問題之後)cron 需要與 GUI 分離。如果使用者 1000 未登錄,我可以採取以下幾種選擇之一:

  1. 什麼都不做(可能可以接受,因為我想保持簡單)
  2. 下次登錄時向使用者顯示帶有完成消息的對話框(最佳)
  3. 顯示其他類型的通知(注意:電腦是沒有安裝郵件伺服器的桌面系統)

我發現了這些相關問題:x11 - Anacron 作業抱怨“Gtk-WARNING **:無法打開顯示” - Unix & Linux Stack Exchange Anacron 作業抱怨“Gtk-WARNING **:無法打開顯示”

shell - 如何將數據傳遞到程序之外以進行 zenity 程序?- Unix & Linux Stack Exchange 如何在程序外傳遞數據以獲得 zenity 進度?

範常式式碼(來自與我的基本相同的其他問題):

#!/bin/bash
# Backs up the local filesystem on the external HDD

sleep 60

DISPLAY=:0.0

zenity --question --text "Do you want to backup? Be sure to turn on the HDD."
if [ $? -ne 0 ]
   then exit 1
fi

*Do backup stuff here*

錯誤:

(zenity:9917): Gtk-WARNING **: cannot open display: 
run-parts: /etc/cron.daily/backup-on-external exited with return code 1

(我正在執行 Kubuntu,所以 KDE 解決方案會比 Zenity 更好,但我已經安裝了 Zenity,所以我可以繼續使用它。)

嘗試將以下內容添加到您的~/.xinitrc(或者~/.xsession如果您使用登錄管理器):

while true; do
   if [[ -a ~/.messages ]]; then
       zenity --info --text="$(printf "%q" $(cat ~/.messages))"
       rm ~/.messages
   fi
   sleep 10
done &

我沒有用zenity測試過它,因為我沒有它,我假設它.xsession按預期工作——我從未使用過登錄管理器。

while/塊將done無限期執行,檢查之間有十秒的延遲(sleep 10部分)。每次檢查時,如果在使用者的 homedir 中if呼叫了一個非空文件,則守衛會成功。.messages成功時,將文件的內容讀入 zenity 並刪除文件。

我對printf嘔吐物並不感到興奮,但應該沒問題。

放入的內容~/.messages應該從 cron 重定向,您需要確保適當地更改文件的所有者和組。也許是這樣的:

10 * * * * /usr/bin/mything && echo "mything completed" > /home/username/.messages && chown username:groupname /home/username/.messages

我的系統是 ubuntu 13.04。我通過 anacrontab 執行了一個類似於你的腳本,它可以工作。試試這個 ..

設置你的 crontab ..

$ cat /path/crontabfile
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

*   *   *   *   *   /bin/bash /path/anacron-tst/s1.sh

替代方案:設置您的 anacrontab ..

$ cat /etc/anacrontab
### original
.. ,, ..
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
HOME=/root
LOGNAME=root

# These replace cron's entries
1   5   cron.daily  run-parts --report /etc/cron.daily
7   10  cron.weekly run-parts --report /etc/cron.weekly
@monthly    15  cron.monthly    run-parts --report /etc/cron.monthly
### end-original

### my custom lines ..
SHELL=/bin/bash
HOME=/home/me
LOGNAME=me

1   2   me1 /bin/bash /path/anacron-tst/s1.sh

在你的腳本中..

$ cat /path/anacron-tst/s1.sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

export DISPLAY=:0.0
export XAUTHORITY=/home/me/.Xauthority

zenity --question --text "Backup time .. is HDD connected?"

if [ $? -ne 0 ]; then
   echo "No confirmation .. quiting"
   exit 1
else
   echo "Will attempt backup now .."
fi

這來自 man 5 anacrontab ..

.. lines can be of three kinds:  job-description lines, environment assignments, or empty lines.

Environment assignment lines are of the form: VAR = VALUE
.. ,, ..
The assignment takes effect from the next line to the end of the  file,  or
to the next assignment of the same variable.

這適用於為 root 安裝的 crontab。請注意,我已編輯腳本以包含*“export XAUTHORITY=/home/me/.Xauthority”*行。它需要它來工作。

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