Bash

奇怪的 crontab 腳本互動(bash)

  • November 6, 2016

我正在執行 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將打開一個文本編輯器(通常是vivim),您可以在其中使用與向系統/etc/crontab文件添加條目相同的語法添加條目。

教程涵蓋了添加 crontab 的基礎知識

此外,當通過添加使用者的 crontabcrontab -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 執行命令,則無需手動設置它。

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