本文說的計畫任務是指linux的cronjob。
語法
下面是個簡單的計畫任務:
10 * * * * /usr/bin/php /www/virtual/username/cron.php > /dev/null 2>&1
它主要有兩部分組成:
1.」10 * * * *」 ,這是定時器。
2.其他部分是命令,它們會在命令列執行。
這個例子中,命令本身又有三個部分:
1.」/usr/bin/php」。php指令碼通常不會自己執行,它需要通過php解析器來執行。
2.」/www/virtual/username/cron.php」。這個是需要執行的指令碼的路徑。
3.」> /dev/null 2>&1″。這部分是處理指令碼的輸出的。稍後我們詳細說它。
定時器語法
就是上面計畫任務的第一部分。它決定了何時執行計畫任務。
它包含5部分:
1.分鐘(0-59)
2.小時(0-23)
3.乙個月的哪一天(1-31)
4.一年中的哪個月(1-12)
5.星期幾(0是星期天)
星號
如果某個部分出現的是星號而不是數字,就是說明這個部分表示的時間全部會執行。
不太容易說清楚,看例子吧。
示例:
下面的計畫任務會一直執行
* * * * * [command]
下面的計畫任務會在每個小時的0分時執行(就是每小時執行一次)
0 * * * * [command]
下面依舊是乙個每小時執行一次的計畫任務。不過是在每個小時的一刻鐘時執行的(1:15,2:15.。。)
15 * * * * [command]
下面的計畫任務每天執行一次,在2:30分
30 2 * * * [command]
下面的計畫任務是在每個月2號的午夜執行(比如:2023年2月2日00:00)
0 0 2 * * [command]
下面的計畫任務會在每週一的每個小時0分鐘時執行一次
0 * * * 1 [command]
下面的會每小時執行3次,在0分,10分,和20分時
0,10,20 * * * * [command]
下面是用除號「/」表示每多少執行一次。本例是每5分鐘執行一次
*/5 * * * * [command]
還可以用「-」表示乙個範圍,如下表示5到10點的每個整點執行一次
0 5-10 * * * [command]
另外還有乙個特殊的時間關鍵字「@reboot」,就是每次重啟伺服器時執行計畫任務
@reboot [command]
設定和管理計畫任務crontab -e
如果你只想看看,不需要編輯,可以使用以下的命令
crontab -l
要刪除crontab的內容,就是刪除所有的計畫任務,可以這樣:
crontab -r
系統會詢問「remove crontab for 使用者名稱?」你敲下y,就刪除了使用者的crontab了
通重載入檔案來設立計畫任務
crontab cron.txt
這個要謹慎,因為這將會覆蓋掉原本的計畫任務的內容。
注釋
注釋使用#字元。例如:
# this cron job does something very important
10 * * * * /usr/bin/php /www/virtual/username/cron.php > /dev/null 2>&1
設定e-mail
預設情況下,計畫任務的輸出會傳送到email,除非你取消他,或是定向到乙個檔案。這樣設定mailto:
mailto="[email protected]"
# this cron job does something very important
10 * * * * /usr/bin/php /www/virtual/username/cron.php > /dev/null 2>&1
使用php解析器
cgi指令碼預設是可以執行的,但是php指令碼不行。他們需要用php解析器來執行。這就是我們要把php解析器的路徑放到php指令碼前的原因。
* * * * * /usr/bin/php [path to php script]
有時候php解析器可能在這裡」/usr/local/bin/php」。我們可以用下面的命令找到正確的路徑:
輸入:which php
系統反饋:/usr/local/bin/php
ok,我們就知道php解析器的路徑了。
處理輸出
如果你不處理輸出,它們會傳送mail到你的伺服器賬號裡。
如果你在命令行尾新增」> /dev/null 2>&1″,輸出將會丟棄。(其他命令後面接它也會丟棄輸出)。
$ /usr/local/bin/php hello.php
hello world
$ /usr/local/bin/php hello.php > /dev/null 2>&1
$大於號(>)用於重定向輸出。」/dev/null」是個空裝置,輸出到那裡就會忽略掉。
「2>&1″是標準錯誤輸出,定向到標準輸出。也是到」/dev/null」.
輸出到檔案
輸出到檔案也是用的大於號「>」.
10 * * * * /usr/bin/php /www/virtual/username/cron.php > /var/log/cron.log
這將會每次都覆蓋原來的輸出。如果你想要的是追加到以前的輸出後面,可以用兩個大於號」>>」來處理。
10 * * * * /usr/bin/php /www/virtual/username/cron.php >> /var/log/cron.log
可執行指令碼#!/usr/local/bin/php
<?php
echo "hello world/n";
// ...
?>
再設定一下許可權,使之可執行,比如chmod到755.
比如上面的hello.php,再 「chmod 755 hello.php」
直接執行:
$ ./hello.php
hello world
$這時,你的計畫任務就可以這樣寫了
10 * * * * /www/virtual/username/hello.php
防止定時任務撞車$fp = fopen('/tmp/lock.txt', 'r+');
if(!flock($fp, lock_ex | lock_nb))
/* ... */
fclose($fp);
過程:開啟檔案,判斷檔案是否鎖定,鎖定了就退出。這樣第乙個計畫任務沒執行結束時,檔案不會關閉,也就沒有解鎖。
下乙個時間觸發的計畫任務,也嘗試開啟檔案,發現已被鎖定,於是退出。這樣就不會撞車了。
組織web訪問計畫任務
如果你用php寫了計畫任務,那你要保證其他人不可以從web訪問到它。簡單的方法是把這些指令碼放到web目錄外。
如果無法放到web目錄外,可以在計畫任務要執行的指令碼的目錄下,用.htaccess 檔案控制:
deny from all你也可以在php指令碼裡限制:
if (isset($_server['remote_addr'])) die('permission denied.');
這將保證,如果是從網路來的,會立即停止php指令碼的執行。
Linux筆記之計畫任務
計畫任務有一次性和長期性之分 part 1 一次性任務 引數 作用at 時間 安排一次性任務 atq 或 at l 檢視任務列表 at c 序號 瀏覽任務與設定環境 atrm 序號 刪除任務 root okaka desktop at 14 45 at service network restart...
Linux入門筆記(計畫任務)
計畫任務的方式可以有兩種 在 linux 中實現這兩個功能就要使用到at和crontab這兩個命令 要使用單一計畫任務時,linux 必須要有負責這類計畫任務的服務,那就是atd服務。使用 yum y install at然後手動啟動它 systemctl restart atd 重新啟動 atd ...
Linux計畫任務
1.at命令 指定乙個時間執行乙個任務。2.cron命令 根據乙個時間表自動執行任務。3.anacron命令 在乙個指定時間間隔錯過後自動執行任務。at命令 安排乙個任務在未來執行,需要乙個系統後台atd程序。4.如果這個程序沒有開啟,那麼執行 etc init.d atd restart chkc...