crontab
crontab學習網站(19. crontab 定時任務 — Linux Tools Quick Tutorial)
例子
今天實際工作里用到的(已經進行了防信息泄露處理
比如我現在希望每周三上午10:00之行一個php腳本
--gpt生成
00 10 * * 3 cd /home/user/project/risk && /usr/local/bin/php sendCheckVersionInfoRiskTagEmail.php > sendCheckVersionInfoRiskTagEmail.log 2>&1
-
00 10 * * 3: 這是 cron 作業的時間表達式,指定了作業運行的時間。這表示在每周的周三的上午 10:00 執行作業。
-
cd /home/user/project/risk: 這一行是改變工作目錄到指定的路徑。在這里,它將工作目錄切換到
/home/user/project/risk
。 -
&&: 這是邏輯運算符 "AND",表示只有當前一個命令成功執行后才執行下一個命令。
-
/usr/local/bin/php sendCheckVersionInfoRiskTagEmail.php: 這是要執行的命令,它會運行一個 PHP 腳本文件
sendCheckVersionInfoRiskTagEmail.php
。在這里,它使用了 PHP 解釋器/usr/local/bin/php
來執行這個腳本。 -
> sendCheckVersionInfoRiskTagEmail.log 2>&1: 這部分是輸出重定向的語法,將命令的標準輸出重定向到
sendCheckVersionInfoRiskTagEmail.log
文件中,并將標準錯誤輸出(2)重定向到標準輸出(1),這樣可以將標準錯誤輸出也寫入到同一個日志文件中。
因此,這段代碼的作用是在每周三的上午 10:00,切換工作目錄到 /home/user/project/risk
目錄,并執行一個 PHP 腳本 sendCheckVersionInfoRiskTagEmail.php
,將執行過程的輸出記錄到日志文件中。
crontab詳解
概述
通過crontab 命令,我們可以在固定的間隔時間執行指定的系統指令或 shell script腳本。時間間隔的單位可以是分鐘、小時、日、月、周及以上的任意組合。這個命令非常適合周期性的日志分析或數據備份等工作。
主要就是定時地執行某個腳本,而不需要耗費大量人力重復性執行
crontab命令格式
-
crontab [-u user] file crontab [-u user] [ -e | -l | -r ]
命令參數
注:其實實際工作時,都是公用的crontab文件,基本上用crontab -e就夠了,修改crontab文件內容
-
-u user:用來設定某個用戶的crontab服務;
-
file:file是命令文件的名字,表示將file做為crontab的任務列表文件并載入crontab。如果在命令行中沒有指定這個文件,crontab命令將接受標準輸入(鍵盤)上鍵入的命令,并將它們載入crontab。
-
-e:編輯某個用戶的crontab文件內容。如果不指定用戶,則表示編輯當前用戶的crontab文件。
-
-l:顯示某個用戶的crontab文件內容,如果不指定用戶,則表示顯示當前用戶的crontab文件內容。
-
-r:從/var/spool/cron目錄中刪除某個用戶的crontab文件,如果不指定用戶,則默認刪除當前用戶的crontab文件。
-
-i:在刪除用戶的crontab文件時給確認提示。
crontab實際調用腳本的命令格式
分 時 日 月 星期 要運行的命令
(比如最上方舉的例子:00 10 * * 3: 這是 cron 作業的時間表達式,指定了作業運行的時間。這表示在每周的周三的上午 10:00 執行作業。)
-
第1列分鐘0~59
-
第2列小時0~23(0表示子夜)
-
第3列日1~31
-
第4列月1~12
-
第5列星期0~7(0和7表示星期天)
-
第6列要運行的命令
實例
實例1:每1分鐘執行一次myCommand
*****myCommand
實例2:每小時的第3和第15分鐘執行
3,15****myCommand
實例3:在上午8點到11點的第3和第15分鐘執行
3,158-11***myCommand
實例4:每隔兩天的上午8點到11點的第3和第15分鐘執行
3,158-11*/2**myCommand
實例5:每周一上午8點到11點的第3和第15分鐘執行
3,158-11**1myCommand
實例6:每晚的21:30重啟smb
3021***/etc/init.d/smbrestart
實例7:每月1、10、22日的4 : 45重啟smb
4541,10,22**/etc/init.d/smbrestart
實例8:每周六、周日的1 : 10重啟smb
101**6,0/etc/init.d/smbrestart
實例9:每天18 : 00至23 : 00之間每隔30分鐘重啟smb
0,3018-23***/etc/init.d/smbrestart
實例10:每星期六的晚上11 : 00 pm重啟smb
023**6/etc/init.d/smbrestart
實例11:每一小時重啟smb
**/1***/etc/init.d/smbrestart
實例12:晚上11點到早上7點之間,每隔一小時重啟smb
023-7***/etc/init.d/smbrestart
注意事項
-
新創建的cron job,不會馬上執行,至少要過2分鐘才執行。如果重啟cron則馬上執行。
-
當crontab失效時,可以嘗試/etc/init.d/crond restart解決問題。或者查看日志看某個job有沒有執行/報錯tail -f /var/log/cron。-
-
千萬別亂運行crontab -r。它從Crontab目錄(/var/spool/cron)中刪除用戶的Crontab文件。刪除了該用戶的所有crontab都沒了。
-
注意時區,在終端中使用date命令查看時區,如果時區不一致的話,會導致腳本運行的時間和你預想的不一致
-
-
在crontab中%是有特殊含義的,表示換行的意思。如果要用的話必須進行轉義%,如經常用的date ‘+%Y%m%d’在crontab里是不會執行的,應該換成date ‘+%Y%m%d’。
history查看命令的執行時間
這個指的是,我們使用history本來只能看到命令序號和具體用過什么命令,而不知道這個命令發生的時間,在進行一些溯源時比較麻煩
之所以想去了解這個東西,是因為今天mt說因為我早上寫需求的時候沒pull最新的代碼,加上我自己的然后就提交了,導致他的代碼被覆蓋
為了確定我早上是否進行了拉取最新代碼的操作,我就去查了一下history怎么顯示出命令發生的時間。
->
mac設置方式 :
echo'HISTTIMEFORMAT="%F %T "' >> ~/.bashrc
source ~/.bashrc
如果使用了zsh環境的終端(比如我):
使用history -i