The Issue of the Day Before

使用 shell script 新增一筆 crontab

linux -

(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 目錄下。

閱讀在雲端