奇怪的 crontab 腳本互動(bash)
我正在執行 Ubuntu 12.04 和 bash。我編寫了一對 shell 腳本,允許我設置一個警報,在響起後,它會自行取消設置。第一個,
alarmset
允許我輸入時間並在我的使用者 crontab 中修改警報行。該行啟動第二個腳本,alarmring
該腳本在瀏覽器視窗中啟動廣播播放器,然後在 crontab 中註釋掉警報行。
alarmring
行為奇怪。如果我自己直接執行它,它會執行兩個操作:它會啟動瀏覽器視窗並編輯 crontab。但是如果我執行alarmset
,當 crontabalarmring
在指定時間啟動時,會alarmring
編輯 crontab,但不會啟動瀏覽器視窗。最後,當 crontab 執行時
alarmring
,它會忽略該set -x
命令,而當我直接執行它時,它set -x
會被執行。所以就好像 crontab 跳過了前十行。關於發生了什麼的任何想法?我將在下面粘貼兩個腳本和 crontab。
警報設置:
#!/bin/bash # alarmset set -x usage() { echo "alarmset [ hour minute | -h ]" } editcrontab() { echo $'/alarmring/s/^\(.*\)\(\* \* \*\)/'$2$' '$1$' \\2/' > ~/Documents/crontab_script.txt crontab -l | sed --file=/home/username/Documents/crontab_script.txt > ~/Documents/new_crontab.txt crontab ~/Documents/new_crontab.txt } ### MAIN case $# in 2 ) editcrontab $1 $2 ;; * ) usage exit ;; esac set +x
警報:
#!/bin/bash # alarmring set -x env DISPLAY=:0 # Ring the alarm : launch BBC World Service in Firefox firefox --new-window http://www.bbc.co.uk/radio/player/bbc_world_service # Unset the alarm : comment out the alarm line in the crontab crontab -l | sed '/alarmring/s/^/#/1' > ~/Documents/new_crontab.txt crontab ~/Documents/new_crontab.txt set +x
crontab:
SHELL=/bin/bash PATH=~/bin:/usr/bin:/bin # # m h dom mon dow command 53 07 * * * /home/username/bin/alarmring
系統 crontab (
/etc/crontab
) 或目錄(/etc/cron.d
-或 -/etc/cron.hourly
等)中的條目以 root 身份執行。預設情況下,root 可能無法訪問給定使用者的顯示。我建議使用使用者添加 crontab 的能力來製作 crontab 條目。這可以通過
crontab -e
在以指定使用者身份登錄的 shell 中使用命令來完成。該命令
crontab -e
將打開一個文本編輯器(通常是vi
或vim
),您可以在其中使用與向系統/etc/crontab
文件添加條目相同的語法添加條目。此外,當通過添加使用者的 crontab
crontab -e
並且您的腳本需要訪問您的顯示器(比如您正在啟動一個 GUI)時,您需要設置環境變數 (export DISPLAY=:0.0
) 以便 GUI 獲取正確的顯示器。例如
% crontab -e
並添加以下行:
53 07 * * * export DISPLAY=:0.0;/home/username/bin/alarming
要執行 GUI 程序,您需要設置
DISPLAY
環境變數,可能還需要設置XAUTHORITY
。請參閱 在遠端 X 顯示器上打開一個視窗(為什麼“無法打開顯示器”)?了解更多資訊。
~
這意味著您的主目錄是一個 shell 功能,您不能在 crontab 中使用它。出於同樣的原因,您不能使用HOME
. 使用主目錄的完整路徑:PATH=/home/username/bin:/usr/bin:/bin
使用 bash 作為你的 shell,
~
實際上可以工作,因為 bash 擴展~
了PATH
. 但這是 bash 的一個奇怪之處,沒有其他 shell 或其他程序以這種方式工作。該命令
env DISPLAY=:0
顯示目前環境,但DISPLAY
設置為:0
. 那沒用。你大概的意思是export DISPLAY=:0
。你的安排很複雜。Cron 專為重複任務而設計。如果您只想安排一次後台作業,請使用at。
at 7:53 <<EOF firefox --new-window http://www.bbc.co.uk/radio/player/bbc_world_service EOF
At 保留
DISPLAY
環境變數,因此如果您at
從希望 Firefox 顯示視窗的 GUI 執行命令,則無需手動設置它。