Linux中有兩類任務計劃,第一種是某個時間執行一次,用at來實現;另一種是周期性執行任務,用cron來實現。
- Linux本地電子郵件服務
- at系列:一次性計劃任務
2.1 at命令
2.2 batch命令- cron:周期性任務計劃
3.1、crond配置文件
3.2、cron任務中的時間表示
3.3、crontab命令
任務計劃的執行結果默認都用郵件來通知用戶,所以先來介紹一下Linux系統的郵件功能。
1、Linux本地電子郵件服務
常見的郵件協議有以下三種:
- smtp:simple mail transmission protocol:簡單郵件傳輸協議
- pop3: post office porotocol:郵局協議
- imap4: internet mail access protocol, 互聯網郵件訪問協議
Linux中使用mail或mailx命令來實現本地電子郵件服務。
- mailx - send and receive Internet mail
最常用的是-s subject選項,指定郵件主題。
生成郵件正文的三種方式
交互式輸入:.單獨成行可以表示正文結束;Ctrl+d提交亦可;
[root@localhost ~]# mail -s 'test mail from root' user1
#發送一封主題為test mail from root的郵件到user。
hello user1.
from root!
.
# .點單獨成行,郵件正文結束。
EOT
[root@localhost ~]# su - user1
[user1@localhost ~]$ mail
#切換到user1,用mail收郵件,可以看到一封新郵件。
Heirloom Mail version 12.4 7/29/08. Type ? for help.
"/var/spool/mail/user1": 1 message 1 new
>N 1 root Sun Jun 10 11:38 19/637 "test mail from root"
通過輸入重定向,將文件內容附到正文中。
[user1@localhost ~]$ mail -s 'file passwd' root < /etc/passwd
#將/etc/passwd文件的內容附到正文發送給root。
[user1@localhost ~]$ exit
logout
You have mail in /var/spool/mail/root
[root@localhost ~]# mail
#root用戶收到郵件。
Heirloom Mail version 12.4 7/29/08. Type ? for help.
"/var/spool/mail/root": 1 message 1 new
>N 1 user1@localhost.loca Sun Jun 10 11:49 37/1493 "file passwd"
& 1
#查看郵件。
Message 1:
From user1@localhost.localdomain Sun Jun 10 11:49:10 2018
Return-Path: <user1@localhost.localdomain>
X-Original-To: root
Delivered-To: root@localhost.localdomain
Date: Sun, 10 Jun 2018 11:49:09 +0800
To: root@localhost.localdomain
Subject: file passwd
User-Agent: Heirloom mailx 12.4 7/29/08
Content-Type: text/plain; charset=us-ascii
From: user1@localhost.localdomain
Status: R
#以下為郵件正文內容。
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
以下省略
使用cat命令,通過管道,將文件內容輸出重定向到郵件正文。
[root@localhost ~]# cat /etc/fstab | mail -s 'file fstab' user1
#將/etc/fstab文件內容附到正文發送給user1。
[root@localhost ~]# su - user1
[user1@localhost ~]$ mail
#切換到user1,使用mail收取郵件。
Heirloom Mail version 12.4 7/29/08. Type ? for help.
"/var/spool/mail/user1": 2 messages 1 new
1 root Sun Jun 10 11:38 20/648 "test mail from root"
>N 2 root Sun Jun 10 11:53 32/1383 "file fstab"
& 2
#查看主題名為“file fstab”的郵件
Message 2:
From root@localhost.localdomain Sun Jun 10 11:53:50 2018
Return-Path: <root@localhost.localdomain>
X-Original-To: user1
Delivered-To: user1@localhost.localdomain
Date: Sun, 10 Jun 2018 11:53:50 +0800
To: user1@localhost.localdomain
Subject: file fstab
User-Agent: Heirloom mailx 12.4 7/29/08
Content-Type: text/plain; charset=us-ascii
From: root@localhost.localdomain (root)
Status: R
#郵件正文為/etc/fstab文件的內容。
#
# /etc/fstab
# Created by anaconda on Sat Jun 2 10:39:48 2018
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/VolGroup-lv_root / ext4 defaults 1 1
UUID=bc141b9a-bdda-44c7-991a-f56e9cee8f6a /boot ext4 defaults 1 2
/dev/mapper/VolGroup-lv_swap swap swap defaults 0 0
tmpfs /dev/shm tmpfs defaults 0 0
以下省略
2、at系列:一次性計劃任務
在未來某一時刻一次性執行某任務。
- at, batch, atq, atrm - queue, examine or delete jobs for later execution
at是一個命令系列,包含at、batch、atq、atrm4個命令。
2.1、at命令
at [OPTION]... TIME
OPTION
-l:查看作業隊列,相當于atq命令
-f /PATH/FROM/SOMEFILE:從指定文件中讀取作業任務,而非交互式輸入
-d #:#是作業號,刪除指定作業,相當于atrm #命令
-c:查看指定作業的具體內容;
-q QUEUE: 指明隊列;
TIME
- 確切的某一時刻:
HH:MM[YYYY-mm-dd]
noon: 中午12點
midnight:午夜12點
teatime:下午4點
tomorrow - 指定從現在起往后的某個時刻:
now+#UNIT
(UNIT: minutes, hours, days, weeks)
如:2分鐘后執行ls /etc命令。
[root@localhost ~]# at now+2min
#指定任務執行時間。
at> ls /etc
at> <EOT>
#指定任務內容,完成后Ctrl+D提交。
job 1 at 2018-06-10 12:08
[root@localhost ~]# atq
3 2018-06-10 12:16 a root
#atq查看任務列表,也可以使用at -l。
[root@localhost ~]# mail
#執行成功后,會收到郵件。
Heirloom Mail version 12.4 7/29/08. Type ? for help.
"/var/spool/mail/root": 2 messages 1 new
1 user1@localhost.loca Sun Jun 10 11:49 38/1504 "file passwd"
>N 2 root Sun Jun 10 12:16 164/1874 "Output from your job 3"
& 2
Message 2:
From root@localhost.localdomain Sun Jun 10 12:16:01 2018
Return-Path: <root@localhost.localdomain>
X-Original-To: root
Delivered-To: root@localhost.localdomain
Subject: Output from your job 3
To: root@localhost.localdomain
Date: Sun, 10 Jun 2018 12:16:01 +0800 (CST)
From: root@localhost.localdomain (root)
Status: R
#郵件正文內容為ls /etc的內容。
adjtime
aliases
aliases.db
alternatives
anacrontab
以下省略
2.2、batch命令
batch命令的用法和at相似,只不過它不用指定任務執行的時間,而是在系統空閑時自動執行指定的任務。
如:在系統空閑時執行ls /var,如果設定任務時系統是空閑的,那么這條命令會立即執行。
[root@localhost ~]# batch
#batch命令不需要指定時間。
at> ls /var
at> <EOT>
job 4 at 2018-06-10 12:19
[root@localhost ~]# mail
#在郵件中查看執行結果。
Heirloom Mail version 12.4 7/29/08. Type ? for help.
"/var/spool/mail/root": 3 messages 1 new
1 user1@localhost.loca Sun Jun 10 11:49 38/1504 "file passwd"
2 root Sun Jun 10 12:16 165/1885 "Output from your job 3"
>N 3 root Sun Jun 10 12:20 30/578 "Output from your job 4"
& 3
Message 3:
From root@localhost.localdomain Sun Jun 10 12:20:07 2018
Return-Path: <root@localhost.localdomain>
X-Original-To: root
Delivered-To: root@localhost.localdomain
Subject: Output from your job 4
To: root@localhost.localdomain
Date: Sun, 10 Jun 2018 12:20:07 +0800 (CST)
From: root@localhost.localdomain (root)
Status: R
#郵件正文為ls /var的內容。
cache
crash
db
empty
games
以下省略
3、cron:周期性任務計劃
cron可以實現系統周期性地執行某一任務,它是由cronie程序包提供的功能,有crond守護進程和相關輔助工具。
[root@localhost ~]# rpm -q cronie
cronie-1.4.4-15.el6.x86_64
要使用cron制定周期性任務,必須確保crond守護進程處于運行狀態,并設置了開機啟動:
[root@localhost ~]# service crond status
crond (pid 1520) is running...
[root@localhost ~]# chkconfig | grep crond
crond 0:off 1:off 2:on 3:on 4:on 5:on 6:off
3.1、crond配置文件
向crond提交作業任務需要使用專用的配置文件。
cron任務分為兩類,系統cron任務和用戶cron任務,所以對應的配置文件也有兩類:
-
系統cron任務
系統cron任務需要通過手動編輯/etc/crontab配置文件。配置文件的格式如下:
SHELL=/bin/bash
#執行任務所使用的SHELL。
PATH=/sbin:/bin:/usr/sbin:/usr/bin
#SHELL的PATH變量。
MAILTO=root
#任務執行結果需要通知的用戶。
HOME=/
# For details see man 4 crontabs
#需要查看詳細說明,使用man 4 crontabs獲取。
#以下為每一條任務的配置格式。
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR ``sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
每一行定制一個周期性任務,共7個字段:
- * * * * *,前5個字段用于定義任務執行的周期性時間,按順序分別表示的單位為:分、時、日、月、周,具體的時間格式后面會單獨說明;
- user-name,指定運行任務的用戶身份;
- command to be executed,要執行的具體任務。
這里需要注意,由于cron中的PATH變量和系統中的可能不同,所以要使用命令的絕對路徑,或在配置文件中的PATH字段中添加路徑。
用戶cron任務
用戶cron任務的配置文件為/var/spool/cron/USERNAME。
配置文件格式和系統cron大致相同,但在定制任務時不需要指定用戶身份。
用戶cron任務建議使用crontab命令來進行配置,具體命令用法后面會詳細說明。
3.2、cron任務中的時間表示
前面已經提到,周期性時間由每一行的前5個字段表示,時間單位分別為:分、時、日、月、周,時間的指定有5種方法。
- 特定值
此值必須為給定時間單位的有效范圍內的值,比如:在“時”這個字段上,只能指定1-24之間的值。
另外需要注意,“月”和“周”兩個字段一般不要同時使用。 - 所有值,用“*”表示
表示給定時間單位的有效范圍內的所有值,表示“每..”。比如:在“分”的字段上指定為“*”,表示每分鐘。 - 離散值,中間用“,”分隔
- 連續值,中間用“-”連接
- 定義步長,用“/”表示
比如,在“時”的字段上指定“*/2”,表示每兩小時。
注意:給定時間單位的有效范圍內的最大值要能被指定的步長整除,否則無效。比如:在“分”的字段上,不可以指定“*/7”,因為60不能被7整除。
-
時間表示示例:
(1) 3 * * * *: 每小時執行一次,時間是每小時的第3分鐘;
(2) 3 4 * * 5: 每周執行一次,時間是每周五4時3分;
(3) 5 6 7 * *:每月執行一次,時間是每月7號的6時5分
(4) 7 8 9 10 *: 每年執行一次,時間是每年的10月9號8點7分
(5) 9 8 * * 3,7: 每周三和周日的8點9分
(6) 0 8,20 * * 3,7: 每周三和周日的8點和20點
(7) 0 9-18 * * 1-5:工作時間內的每小時執行一次
(8) */5 * * * *: 每5分鐘執行一次
3.3、crontab命令
crontab - maintain crontab files for individual users
crontab [-u user] [-l | -r | -e] [-i]
常用選項
-e: 編輯任務;
-l: 列出所有任務;
-r:移除所有任務;即刪除/var/spool/cron/USERNAME文件;
-i: 在使用-r選項移除所有任務時,提示用戶確認;
-u user:root用戶可為指定用戶管理cron任務示例
在root用戶下,為user1用戶制定每小時執行一次cat /etc/fstab的周期性任務:
[root@localhost cron]# crontab -u user1 -e
#-u指定user1,-e編輯
no crontab for user1 - using an empty one
0 * * * * /bin/cat /etc/fstab
#編輯周期性任務內容
crontab: installing new crontab
[root@localhost cron]# crontab -u user1 -l
#查看周期性任務
0 * * * * /bin/cat /etc/fstab
[root@localhost cron]# ls /var/spool/cron
user1
#設定成功后,/var/spool/cron目錄下會有一個以用戶名命名的文件,其中的內容就是剛剛設置的周期性任務。制定每周三凌晨三、五點10分執行某個腳本,輸出當前時間,時間格式為 2017-12-28 10:00:00:
[root@localhost cron_test]# vim date.sh
#編輯腳本
date +"%Y-%m-%d %H:%M:%S"
[root@localhost cron_test]# bash date.sh
#測試腳本
2018-06-11 12:34:41
[root@localhost cron_test]# crontab -e
#設置周期性任務
10 3,5 * * 3 /bin/bash /tmp/testdir/cron_test/date.sh
crontab: installing new crontab