使用 shell script 新增一筆 crontab
linux shell cron -(crontab -l 2>/dev/null; echo "* * * * * your_command") | sort - | uniq - | crontab -
Why
想為系統增加一個定時的執行程式,稍微熟習 linux
系統的都應該會使用 crontab -e
進行設定,
但有時我們希望能自動化這個過程。就如同條條大路通羅馬一樣,這會有很多做法。
最直覺的想法是寫一個 shell script
來做這件事。
What
- cron
-
一個在
Unix like
OS 下的工具,是基於時間的任務管理系統。透過cron
可以在固定的時間、日期或間隔下,執行任務(可以是命令或腳本)。
How
首先我們想要將 cron job 寫入 crontab
,簡單可行的便是 echo
一個 cron job 給 crontab
。
所以,我們可以使用 echo "* * * * * your_command" | crontab -
。
但這有一個問題若該 cron job 在原來的 crontab
已經有了,那便會有大麻煩。
因為 crontab
提供 crontab -l
讓我們可以將所有的任務列出。
所以我要做便是將它跟我們的任務混合起來並過濾。簡單的利用
(crontab -l ; echo "* * * * * your_command") | sort - | uniq -
經過混合、排序和去重,我們就能得到一個新的列表。
現在我們有,
echo "* * * * * your_command" | crontab - // (1)
(crontab -l ; echo "* * * * * your_command") | sort - | uniq - // (2)
合併(1)(2)兩者我們能得到
(crontab -l ; echo "* * * * * your_command") | sort - | uniq - | crontab -
。
sort`
和 uniq
的運用可以參考 用 shell script 進行集合計算
這已經接近完美,可我們能做的更好。
crontab -l
在目前沒有任何任務時會輸出 no crontab
之類的敘述。這時可以利用
2 > /dev/null
將錯誤重導輸出到 dev/null
去掉不須要的錯誤資訊。
或你可以其中在使用 grep
去掉任何你不想要的行列。例如: crontab -l | grep -v '^[a-zA-Z]'
。
最後我們得到
(crontab -l 2>/dev/null; echo "* * * * * your_command") | sort - | uniq - | crontab -
。
P.S.
如果僅僅希望加入自己的任務,而你已經有一個編輯好的任務列表檔案,
你也能直接將他放到 /etc/cron.d
目錄下。