1. 程式人生 > 實用技巧 >linux的計劃任務 - cron

linux的計劃任務 - cron

檢視cron是否啟動

[root@localhost ~]# ps -aux | grep cron
root       807  0.0  0.0 126292  1604 ?        Ss   11:11   0:00 /usr/sbin/crond -n
root     16740  0.0  0.0 112712   964 pts/0    R+   19:39   0:00 grep --color=auto cron

建立計劃任務

命令格式如下:

*  *  *  *  * command

第一個 * : minute (0-59)
第二個 * : hour(0-23)
第三個 * : day of month (1-31)
第四個 * : month (1-12)
第五個 * : day od week (0-6)
command  : 具體執行任務的命令 
建立方式
crontab -e

# 如: 每分鐘在 /home 目錄下建立一個以當前的年月日時分秒為名字的空白檔案

*/1 * * * * touch /home/$(date +\%Y\%m\%d\%H\%M\%S)

說明
“ % ” 在 crontab 檔案中,有結束命令列、換行、重定向的作用,前面加 “ \ ” 符號轉義,
否則,“ % ” 符號將執行其結束命令列或者換行的作用,並且其後的內容會被做為標準輸入傳送給前面的命令

檢視計劃任務

[root@localhost ~]# crontab -l
*/1 * * * * touch /home/$(date +\%Y\%m\%d\%H\%M\%S)

檢視cron是否已啟動

ps -aux | grep cron
或者
pgrep cron

[root@localhost ~]# ps -aux | grep cron
root       807  0.0  0.0 126292  1604 ?        Ss   11:11   0:00 /usr/sbin/crond -n
root     17154  0.0  0.0 112712   964 pts/0    R+   19:47   0:00 grep --color=auto cron

檢視執行結果

[root@localhost ~]# ll /home/
total 0
-rw-r--r-- 1 root root  0 Nov  6 19:48 20191106194801
-rw-r--r-- 1 root root  0 Nov  6 19:49 20191106194901
-rw-r--r-- 1 root root  0 Nov  6 19:50 20191106195001
-rw-r--r-- 1 root root  0 Nov  6 19:51 20191106195101
-rw-r--r-- 1 root root  0 Nov  6 19:52 20191106195201
-rw-r--r-- 1 root root  0 Nov  6 19:53 20191106195301
-rw-r--r-- 1 root root  0 Nov  6 19:54 20191106195401

檢視執行日誌

[root@localhost ~]# tail -f /var/log/cron
Nov  6 19:47:15 localhost crontab[17104]: (root) END EDIT (root)
Nov  6 19:47:35 localhost crontab[17141]: (root) LIST (root)
Nov  6 19:48:01 localhost CROND[17166]: (root) CMD (touch /home/$(date +%Y%m%d%H%M%S))
Nov  6 19:49:01 localhost CROND[17219]: (root) CMD (touch /home/$(date +%Y%m%d%H%M%S))
Nov  6 19:50:01 localhost CROND[17273]: (root) CMD (touch /home/$(date +%Y%m%d%H%M%S))
Nov  6 19:51:01 localhost CROND[17327]: (root) CMD (touch /home/$(date +%Y%m%d%H%M%S))
Nov  6 19:52:01 localhost CROND[17380]: (root) CMD (touch /home/$(date +%Y%m%d%H%M%S))
Nov  6 19:53:01 localhost CROND[17433]: (root) CMD (touch /home/$(date +%Y%m%d%H%M%S))
Nov  6 19:54:01 localhost CROND[17486]: (root) CMD (touch /home/$(date +%Y%m%d%H%M%S))
Nov  6 19:55:01 localhost CROND[17540]: (root) CMD (touch /home/$(date +%Y%m%d%H%M%S))

刪除計劃任務

# 刪除任務計劃
[root@localhost ~]# crontab -r
# 檢視任務計劃
[root@localhost ~]# crontab -l
no crontab for root

每個使用者使用crontab -e 建立計劃任務後,會在 /var/spool/cron/ 中新增一個該使用者自己的計劃任務文件,目的是為了隔離。

[root@localhost ~]# ll /var/spool/cron/
total 8
-rw------- 1 lee  lee  56 Nov  6 19:58 lee
-rw------- 1 root root 52 Nov  6 20:00 root

cron服務檢測時間的最小單位是分鐘,所以cron 會每分鐘去讀一次 /etc/crontab 和 /var/spool/cron/ 裡的內容

[root@localhost ~]# ll /etc/ | grep cron
-rw-------   1 root root    541 Aug  9 07:07 anacrontab
drwxr-xr-x.  2 root root     21 Oct 14 16:11 cron.d
drwxr-xr-x.  2 root root     42 Mar  6  2019 cron.daily
-rw-------   1 root root      0 Aug  9 07:07 cron.deny
drwxr-xr-x.  2 root root     22 Oct 14 16:11 cron.hourly
drwxr-xr-x.  2 root root      6 Jun 10  2014 cron.monthly
-rw-r--r--.  1 root root    451 Jun 10  2014 crontab
drwxr-xr-x.  2 root root      6 Jun 10  2014 cron.weekly


上面的目錄的作用:
/etc/cron.daily,目錄下的指令碼會每天執行一次,在每天的6點25分時執行;
/etc/cron.hourly,目錄下的指令碼會每個小時執行一次,在每小時的17分鐘時執行;
/etc/cron.monthly,目錄下的指令碼會每月執行一次,在每月1號的6點52分時執行;
/etc/cron.weekly,目錄下的指令碼會每週執行一次,在每週第七天的6點47分時執行;

系統預設執行時間可以根據需求進行修改

舉例1、備份日誌

每天3點備份 /home/logs/user.log 檔案到 /data/logs/目錄下,並刪除前一天的日誌,備份的日誌檔名是年-月-日的格式

執行:
crontab -e
0 3 * * * rm /data/logs/*
0 3 * * * cp /home/logs/user.log /data/logs/$(date +\%Y-\%m-\%d)

舉例2、上傳檔案

每天2點通過sftp的方式上傳一個檔案到其他伺服器上

編寫執行指令碼 upload.sh

#!/bin/bash
# SFTP配置資訊
# IP
IP=10.20.0.101
# 埠
PORT=22
# 使用者名稱
USER=lee
# 密碼
PASSWORD=111111
# 需要上傳的檔名 (檔名為user-前一天日期.csv   (如user-2019-11-07.csv))
FILE=user-$(date -d -1day +%Y-%m-%d).csv
# 需要上傳的檔案所在目錄
CLIENTDIR=/home/
# 上傳到目標伺服器的目錄
SEVERDIR=./share/

lftp -u ${USER},${PASSWORD} sftp://${IP}:${PORT} <<EOF
cd ${SEVERDIR}/
lcd ${CLIENTDIR}
put ${FILE}
by
EOF

建立計劃任務

crontab -e
新增一下內容
0 2 * * * sh /home/uploadFile.sh