通常我們會需要定時啟動一些shell腳本,類似Windows中的Task Scheduler, 下面是在AWS EMR Cluster 主幾點上配置的步驟:
1. 先創建一個shell腳本,將需要執行的任務寫入腳本
vi testcron.sh
2. 修改該腳本的權限,添加執行權限:
chmod a+x testcron.sh
3. 配置crontab, 創建執行任務的schedule:
crontab -e
* * * * * /tmp/testcron.sh #每分鍾執行一次testcron.sh
4. 列出當前用戶的所有定時任務:
crontab -l
5. 刪除當前用戶的所有定時任務:
crontab -r
6. 也可以配置其他用戶:
crontab -u username -e
7. 看 /var/log/cron這個文件就可以,可以用tail -f /var/log/cron觀察
8. 利用 linux flock 鎖機制
利用 flock(FreeBSD lockf,CentOS下為 flock),在腳本執行前先檢測能否獲取某個文件鎖,以防止腳本運行沖突。
格式:
flock [-sxun][-w #] fd#
flock [-sxon][-w #] file [-c] command
選項:
-s, --shared: 獲得一個共享鎖
-x, --exclusive: 獲得一個獨占鎖
-u, --unlock: 移除一個鎖,腳本執行完會自動丟棄鎖
-n, --nonblock: 如果沒有立即獲得鎖,直接失敗而不是等待
-w, --timeout: 如果沒有立即獲得鎖,等待指定時間
-o, --close: 在運行命令前關閉文件的描述符號。用於如果命令產生子進程時會不受鎖的管控
-c, --command: 在shell中運行一個單獨的命令
-h, --help 顯示幫助
-V, --version: 顯示版本
鎖類型:
共享鎖:多個進程可以使用同一把鎖,常被用作讀共享鎖
獨占鎖:同時只允許一個進程使用,又稱排他鎖,寫鎖。
這里我們需要同時只允許一個進程使用,所以使用獨占鎖。
修改后的定時任務如下:
*/1 * * * * flock -xn /tmp/test.lock -c /tmp/testcron.sh >> /tmp/testcron_result.log
為了測試這個功能,我在testcron.sh腳本里,添加了sleep命令
sleep 10m #等待10分鍾
sleep 1h #等待1小時
sleep 10 #等待10秒鍾
