1. 程式人生 > >使用crontab執行定時任務和保證系統中只有一份程式執行

使用crontab執行定時任務和保證系統中只有一份程式執行

最近迷上了定時任務crontab,發現crontab還是好用、省事。遇到兩個小問題。

1、一個任務尚未執行完畢時,新任務又起來。比如,需要定時備份資料,但是第一次備份(資料量很大)尚未結束時,到了啟動時刻,會再起一個備份任務。

多個相同的任務同時執行,可能會出現各種奇怪的情況。

這時,需要保證整個系統中,只有一份程式在執行。原理就是利用系統的資源,加一個標誌,比如開始一個埠,比如對一個檔案加鎖等。我使用java實現的,可以這樣做,任務起來時對一個檔案加鎖,結束時釋放。新任務首先檢查檔案是否被加鎖,如果已經加鎖,則不執行。一個簡單的實現demo:

String fileName = ""; // 待加鎖檔案路徑
FileOutputStream fos = new FileOutputStream(fileName);
FileChannel fc = fos.getChannel(); //獲取FileChannel物件
FileLock fileLock = fc.tryLock();  // 嘗試加鎖
if(null != fileLock) {
    System.out.println("加鎖成功");
}else {
    System.out.println("加鎖失敗,已經有一份程式在執行,本程式退出");
    System.exit(0);
}

// 在這裡實現自己的功能

fileLock.release(); //釋放檔案鎖
fos.close();  //關閉檔案寫操作

2、使用crontab啟動任務時,使用ps檢視程序狀態,發現同時出現兩個程序。一個程序是我要執行的程式,也就是我的任務啟動命令,另外一個程序是:

/bin/sh -c XXX  # XXX是我的任務啟動命令

查了一下,這似乎是crontab的實現機制造成的。在crontab中配置的命令,被/bin/sh -c的形式執行。當然,我的任務還是隻運行了一份,沒有問題。

這可能是linux上出現的現象,在centOS上,試了一下,沒有這個問題,也就是檢視程序,只有一個任務,沒有“/bin/sh -c ”這行。