定時任務與後台指令碼

2022-05-13 03:01:31 字數 3419 閱讀 5920

有些時候,我們需要對於資料進行定時處理或者需要乙個程式常駐記憶體,進行相關任務的處理, 這個時候,就會用到定時任務crontab

1. 定時任務crontab

crond是linux下用來週期性的執行某種任務或等待處理某些事件的乙個守護程序,與windows下的計畫任務類似,當安裝完成作業系統後,缺省會安裝此服務工具,並且會自動啟動crond程序,crond程序每分鐘會定期檢查是否有要執行的任務,如果有要執行的任務,則自動執行該任務。

linux下的任務排程分為兩類,系統任務排程和使用者任務排程。

系統任務排程:系統週期性所要執行的工作,比如寫快取資料到硬碟、日誌清理等。在/etc目錄下有乙個crontab檔案,這個就是系統任務排程的配置檔案。

第一行shell變數指定了系統要使用哪個shell,這裡是bash,第二行path變數指定了系統執行命令的路徑,第三行mailto變數指定了crond的任務執行資訊將通過電子郵件傳送給root使用者,如果mailto變數的值為空,則表示不傳送任務執行資訊給使用者

使用者任務排程:使用者定期要執行的工作,比如使用者資料備份、定時郵件提醒等。使用者可以使用 crontab 工具來定製自己的計畫任務。所有使用者定義的crontab 檔案都被儲存在 /var/spool/cron目錄中。其檔名與使用者名稱一致。

使用者許可權檔案:

檔案:/etc/cron.deny

說明:該檔案中所列使用者不允許使用crontab命令

在以上各個欄位中,還可以使用以下特殊字元:

星號(*):代表所有可能的值,例如month欄位如果是星號,則表示在滿足其它欄位的制約條件後每月都執行該命令操作。

逗號(,):可以用逗號隔開的值指定乙個列表範圍,例如,「1,2,5,7,8,9」

中槓(-):可以用整數之間的中槓表示乙個整數範圍,例如「2-6」表示「2,3,4,5,6」

正斜線(/):可以用正斜線指定時間的間隔頻率,例如「0-23/2」表示每兩小時執行一次。同時正斜線可以和星號一起使用,例如*/10,如果用在minute欄位,表示每十分鐘執行一次。

crond服務:

1) 安裝

yum install crontabs
2)常用操作

/sbin/service crond start //

啟動服務

/sbin/service crond stop //

關閉服務

/sbin/service crond restart //

重啟服務

/sbin/service crond reload //

重新載入配置

/sbin/service crond status //

檢視服務狀態

3)命令引數

-u user:用來設定某個使用者的crontab服務,例如,「-u ixdba」表示設定ixdba使用者的crontab服務,此引數一般有root使用者來執行。

file:file是命令檔案的名字,表示將file做為crontab的任務列表檔案並載入crontab。如果在命令列中沒有指定這個檔案,crontab命令將接受標準輸入(鍵盤)上鍵入的命令,並將它們載入crontab。

-e:編輯某個使用者的crontab檔案內容。如果不指定使用者,則表示編輯當前使用者的crontab檔案。

-l:顯示某個使用者的crontab檔案內容,如果不指定使用者,則表示顯示當前使用者的crontab檔案內容。

-r:從/var/spool/cron目錄中刪除某個使用者的crontab檔案,如果不指定使用者,則預設刪除當前使用者的crontab檔案。

-i:在刪除使用者的crontab檔案時給確認提示

4)使用例項

例項1:每1分鐘執行一次command

命令:* * * * * command

例項2:每小時的第3和第15分鐘執行

命令:3,15 * * * * command

例項3:在上午8點到11點的第3和第15分鐘執行

命令:3,15 8-11 * * * command

注意點:1.指令碼中涉及檔案路徑時寫全域性路徑

2. 注意清理系統使用者的郵件日誌

0 */3 * * * /usr/local/apache2/apachectl restart >/dev/null

2>&1 (錯誤的重定向必須只能使用 ">&1" 的方式)

「/dev/null

2>&1」表示先將標準輸出重定向到/dev/null,然後將標準錯誤重定向到標準輸出,由於標準輸出已經重定向到了/dev/null,因此標準錯誤也會重定向到/dev/null,這樣日誌輸出問題就解決了

3. 新建立的cron job,不會馬上執行,至少要過2分鐘才執行。如果重啟cron則馬上執行。

4. 當crontab突然失效時,可以嘗試/etc/init.d/crond restart解決問題。或者檢視日誌看某個job有沒有執行/報錯tail -f /var/log/cron。

2. 常駐記憶體指令碼

1) 有時候,我們經常想讓某個指令碼一直執行,可以使用nohup命令

nohup /usr/bin/php /var/www/handler.php >> /tmp/handler.log 2>&1 &
同時最好使用定時任務監控該指令碼的執**況: 例如使用supervisor代替nohup

常見問題:

1. 例如某指令碼要執行30分鐘,在crontab裡設為每40分鐘執行一次,而比較糟的情況是可能該指令碼在執行週期內沒有完成,接著第二個指令碼又開始執行了

使用linux flock 檔案鎖實現任務鎖定,解決衝突

現在把定時任務改為這樣(把test.php改為testflock.php,便於檢視清晰)

* * * * * flock -xn /tmp/mytest.lock -c 'php /root/testflock.php >> /root/test.log'

等待一會兒,再執行檢視程序的命令,多次檢視後,會發現始終只有乙個 testflock.php 程序

flock說明

使用flock的意義就是每次執行任務時先去獲取檔案獨佔鎖,成功取到鎖,就繼續執行,否則放棄執行

例如第乙個任務可以取得鎖,開始執行,執行完成後,解鎖,第二個任務開始時先去取鎖,如果第乙個任務還沒執行完,則取鎖失敗,不再繼續執行任務

這樣就防止了執行衝突

上面例子中用到了flock的3個引數

-x, --exclusive: 獲得乙個獨佔鎖

-n, --nonblock: 如果沒有立即獲得鎖,直接失敗而不是等待

-c, --command: 在shell中執行乙個單獨的命令

定時任務指令碼

最近的專案用到了定時執行的一些東西,但沒有用到linux裡面的功能,所以自己寫了乙個按時執行的排程程式 bin bash whilerun.sh writeby xingming on 2013年6月29日12 55 49 常駐記憶體,迴圈執行指令碼檔案 各引數含義介紹 1 為程式執行語句,將函式執...

linux後台定時任務

crontab 這個檔案是用來管理後台任務的,系統會自動執行在這裡面設定的任務 有兩種管理這個的方法 1 系統級別 vim etc crontab 2 使用者級別 command crontab e 在裡面直接編輯,ctrl x離開 任務新增的格式 f1 f2 f3 f4 f5 命令 f1代表分鐘,...

3 定時任務指令碼

2.用於linux的定時任務指令碼 附一 kitchen與pan的使用 參考文獻 rem 轉到kitchen命令所在的資料夾下 cd d e etlsoftware kettle data integration kitchen.bat file d job manage projectjop.kj...