2012-12-23 25 views
10

有沒有使用Bash/Shell啓用和禁用Crontab任務的方法?通過Bash/Shell在Crontab中啓用/禁用任務

所以當用戶啓動服務器1時,它將啓用服務器1 Crontab線等等。 而當用戶停止服務器1時,服務器1 Crontab行被禁用(#)。 這是可能的和如何?

在此先感謝

*/1 * * * * Server 1 check 
*/1 * * * * Server 2 check 
*/1 * * * * Server 3 check 
+0

您可以使用一個sentinel目錄供所有的腳本使用,並檢查每個腳本是否他們期望的標記在這裏 - 如果沒有,則終止執行 – fge

回答

14
SERVERNUM=$1 

要啓用:

crontab -l | sed "/^#.*Server $SERVERNUM check/s/^#//" | crontab - 

要禁用:

crontab -l | sed "/^[^#].*Server $SERVERNUM check/s/^/#/" | crontab - 

成績單:

[email protected]$ crontab -l 
*/1 * * * * Server 1 check 
*/1 * * * * Server 2 check 
*/1 * * * * Server 3 check 
[email protected]$ crontab -l | sed '/^[^#].*Server 1 check/s/^/#/' | crontab - 
[email protected]$ crontab -l 
#*/1 * * * * Server 1 check 
*/1 * * * * Server 2 check 
*/1 * * * * Server 3 check 
[email protected]$ crontab -l | sed '/^#.*Server 1 check/s/^#//' | crontab - 
[email protected]$ crontab -l 
*/1 * * * * Server 1 check 
*/1 * * * * Server 2 check 
*/1 * * * * Server 3 check 
+0

它似乎沒有添加/刪除#in crontab。 On = */1 * * * *服務器1檢查 Off =#*/1 * * * *服務器1檢查 – user1621988

+0

我剛剛在我的系統上嘗試過它,它工作。 – Barmar

+0

Wonderfull,這是有效的,我唯一的問題是讓服務器在Bash中動態編號,問題在於,#。* Server $ 1 check/does not work,or「$ 1」。那麼如何將變量$ 1傳遞給Numbers呢? – user1621988

2

我建議你爲每個服務器一個腳本添加你的cron作業到/etc/cron.d。然後讓cron腳本掃描一些標記文件,如果應該執行cron作業。

+0

另一個常見的安排是有一個目錄'/ path/to/servers',然後用'run-parts/path/to/servers'完成一個cron作業。然後禁用服務器重新啓動或刪除其在'servers'目錄中的文件。 ('run-parts'是Debian特有的,但如果你的平臺缺乏它,那麼推出自己的產品並不難。) – tripleee

0

這是一個變體,我使用一個cronjob,每晚加載它自己。我只是編輯一個文件,並在每晚10點重新加載。您可以更頻繁地重新加載。我爲每個節點保留一個文件目錄。訣竅是確保沒有人評論重載行。

0 22 * * * crontab /home/ME/cron_files/NODE 
0

作爲一個快速和髒的修復,您可以啓用或禁用適當的cron腳本的執行權限。

E.g.如果你想防止自動更新其數據庫(它可以是I/O消耗)定位:

cd /etc/cron.daily 

sudo chmod a-x locate 

這可能是對cron的框架,但它正在迅速應用,它的直接需求的情況下工作。