Linux學習之任務計劃(at、batch、crontab)篇
一、linux上的任務計劃
1、分類
linux上的任務計劃可以分爲兩類:
a、週期性執行的任務計劃
crontab
b、後續時間一次性執行的計劃
at、batch
2、電子郵件服務
電子郵件服務使用到的幾個協議:
smtp:simple mail transmission protocol
pop3:post office protocol
imap4:internet mail access protocol
沒個用戶的都有一個專門存放郵件的地方:
/var/spool/mail/USERNAME
[root@pizi mail]# ll 總用量 12 -rw-rw----. 1 3001 mail 0 9月 1 23:33 123user -rw-r--r--. 1 root root 11 9月 5 15:40 at.list -rw-rw----. 1 hadoop mail 0 9月 5 11:01 hadoop -rw-rw----. 1 600 mail 0 8月 27 00:40 piziuser -rw-------. 1 root mail 4773 9月 5 17:02 root -rw-rw----. 1 rpc mail 0 8月 24 23:03 rpc -rw-rw----. 1 usera mail 0 9月 4 20:23 usera -rw-rw----. 1 userb mail 0 9月 4 20:58 userb -rw-rw----. 1 userc mail 0 9月 4 20:58 userc [root@pizi mail]#
mail命令:
mail:進入交互式收發郵件接口;
[root@pizi mail]# mail Heirloom Mail version 12.4 7/29/08. Type ? for help. "/var/spool/mail/root": 5 messages > 1 Mail Delivery System Sat Sep 5 15:22 75/2399 "Undelivered Mail Retu" 2 [email protected] Sat Sep 5 15:23 19/557 "hi" 3 root Sat Sep 5 15:29 37/565 "Output from your job " 4 root Sat Sep 5 15:44 15/544 "Output from your job " 5 Cron Daemon Sat Sep 5 16:30 23/708 "Cron <root@pizi> /bin" &
mail -s 'SUBJECT' username@hostname
[root@pizi mail]# mail -s 'test mail' [email protected] this is test mail EOT [root@pizi mail]# mail Heirloom Mail version 12.4 7/29/08. Type ? for help. "/var/spool/mail/root": 10 messages 1 new 1 Mail Delivery System Sat Sep 5 15:22 75/2399 "Undelivered Mail Retu" 2 [email protected] Sat Sep 5 15:23 19/557 "hi" 3 root Sat Sep 5 15:29 37/565 "Output from your job " 4 root Sat Sep 5 15:44 15/544 "Output from your job " 5 Cron Daemon Sat Sep 5 16:30 23/708 "Cron <root@pizi> /bin" 6 Mail Delivery System Tue Sep 8 22:33 75/2402 "Undelivered Mail Retu" 7 [email protected] Tue Sep 8 22:34 19/567 "hi" 8 [email protected] Tue Sep 8 22:34 19/567 "hi" 9 Mail Delivery System Tue Sep 8 22:35 74/2324 "Undelivered Mail Retu" >N 10 root Tue Sep 8 22:37 18/580 "test mail" &
mail -s 'SUBJECT' username@hostname < /path/from/somefile
[root@pizi mail]# cat /tmp/testmail.txt this is a test mail txt file! [root@pizi mail]# mail -s 'txt' [email protected] < /tmp/testmail.txt [root@pizi mail]# mail Heirloom Mail version 12.4 7/29/08. Type ? for help. "/var/spool/mail/root": 11 messages 1 new 2 unread 1 Mail Delivery System Sat Sep 5 15:22 75/2399 "Undelivered Mail Retu" 2 [email protected] Sat Sep 5 15:23 19/557 "hi" 3 root Sat Sep 5 15:29 37/565 "Output from your job " 4 root Sat Sep 5 15:44 15/544 "Output from your job " 5 Cron Daemon Sat Sep 5 16:30 23/708 "Cron <root@pizi> /bin" 6 Mail Delivery System Tue Sep 8 22:33 75/2402 "Undelivered Mail Retu" 7 [email protected] Tue Sep 8 22:34 19/567 "hi" 8 [email protected] Tue Sep 8 22:34 19/567 "hi" 9 Mail Delivery System Tue Sep 8 22:35 74/2324 "Undelivered Mail Retu" U 10 root Tue Sep 8 22:37 19/590 "test mail" >N 11 root Tue Sep 8 22:41 18/586 "txt" & & 11 Message 11: From [email protected] Tue Sep 8 22:41:32 2015 Return-Path: <[email protected]> X-Original-To: [email protected] Delivered-To: [email protected] Date: Tue, 08 Sep 2015 22:41:32 +0800 To: [email protected] Subject: txt User-Agent: Heirloom mailx 12.4 7/29/08 Content-Type: text/plain; charset=us-ascii From: [email protected] (root) Status: R this is a test mail txt file! &
COMMAND | mail -s 'SUBJECT' username@hostname
[root@pizi mail]# ifconfig | mail -s 'ifconfig' [email protected] [root@pizi mail]# mail Heirloom Mail version 12.4 7/29/08. Type ? for help. "/var/spool/mail/root": 12 messages 1 new 2 unread 1 Mail Delivery System Sat Sep 5 15:22 75/2399 "Undelivered Mail Retu" 2 [email protected] Sat Sep 5 15:23 19/557 "hi" 3 root Sat Sep 5 15:29 37/565 "Output from your job " 4 root Sat Sep 5 15:44 15/544 "Output from your job " 5 Cron Daemon Sat Sep 5 16:30 23/708 "Cron <root@pizi> /bin" 6 Mail Delivery System Tue Sep 8 22:33 75/2402 "Undelivered Mail Retu" 7 [email protected] Tue Sep 8 22:34 19/567 "hi" 8 [email protected] Tue Sep 8 22:34 19/567 "hi" 9 Mail Delivery System Tue Sep 8 22:35 74/2324 "Undelivered Mail Retu" U 10 root Tue Sep 8 22:37 19/590 "test mail" 11 root Tue Sep 8 22:41 19/597 "txt" >N 12 root Tue Sep 8 22:42 35/1448 "ifconfig" & 12 Message 12: From [email protected] Tue Sep 8 22:42:58 2015 Return-Path: <[email protected]> X-Original-To: [email protected] Delivered-To: [email protected] Date: Tue, 08 Sep 2015 22:42:57 +0800 To: [email protected] Subject: ifconfig User-Agent: Heirloom mailx 12.4 7/29/08 Content-Type: text/plain; charset=us-ascii From: [email protected] (root) Status: R eth0 Link encap:Ethernet HWaddr 08:00:27:A1:56:BC inet addr:192.168.3.8 Bcast:192.168.3.255 Mask:255.255.255.0 inet6 addr: fe80::a00:27ff:fea1:56bc/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:1398 errors:0 dropped:0 overruns:0 frame:0 TX packets:975 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:135985 (132.7 KiB) TX bytes:129159 (126.1 KiB)
3、at命令
at命令是承載未來時間運行的某作業:
支持使用作業隊列:
默認爲a隊列;
使用方法:
at [option]... TIME
[option]選項
-q QUEUE :at的作業隊列;
-f /path/from/somefile:從指定的文件中讀取要運行的作業;
-l:查看作業隊列中德等待運行的作業,相當於使用atq命令;
-c AT JOB_NUM:查看待運行作業的內容
-d:刪除指定作業;
TIME時間
a、絕對時間:
HH:MM,MMDD[CC]YY,MM/DD/[CC]/YY
b、相對時間:
now+#unit
unit:minute,hour,day,week
c、模糊時間:
midnight、noon、teatime
[root@pizi mail]# at now+1minute at> ls / at> <EOT> job 4 at 2015-09-08 22:52 [root@pizi mail]# at -l 4 2015-09-08 22:52 a root [root@pizi mail]# mail Heirloom Mail version 12.4 7/29/08. Type ? for help. "/var/spool/mail/root": 13 messages 1 new 2 unread 1 Mail Delivery System Sat Sep 5 15:22 75/2399 "Undelivered Mail Returned to Sender" 2 [email protected] Sat Sep 5 15:23 19/557 "hi" 3 root Sat Sep 5 15:29 37/565 "Output from your job 2" 4 root Sat Sep 5 15:44 15/544 "Output from your job 3" 5 Cron Daemon Sat Sep 5 16:30 23/708 "Cron <root@pizi> /bin/echo "hello"" 6 Mail Delivery System Tue Sep 8 22:33 75/2402 "Undelivered Mail Returned to Sender" 7 [email protected] Tue Sep 8 22:34 19/567 "hi" 8 [email protected] Tue Sep 8 22:34 19/567 "hi" 9 Mail Delivery System Tue Sep 8 22:35 74/2324 "Undelivered Mail Returned to Sender" U 10 root Tue Sep 8 22:37 19/590 "test mail" 11 root Tue Sep 8 22:41 19/597 "txt" 12 root Tue Sep 8 22:42 36/1459 "ifconfig" >N 13 root Tue Sep 8 22:52 36/554 "Output from your job 4" & 13 Message 13: From [email protected] Tue Sep 8 22:52:03 2015 Return-Path: <[email protected]> X-Original-To: root Delivered-To: [email protected] Subject: Output from your job 4 To: [email protected] Date: Tue, 8 Sep 2015 22:52:03 +0800 (CST) From: [email protected] (root) Status: R bin boot dev etc home lib lib64 lost+found media misc mnt net opt proc root sbin selinux srv sys test tmp usr var
4、batch:
由系統自行選擇在資源較爲空閒時運行指定的任務:
5、crontab:週期性的任務計劃
其守護進程爲crond
週期性任務計劃分爲兩類:
a、系統cron任務:沒有默認運行用戶身份,所以需要額外指定運行者;
# 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)
# | | | | |
# * * * * * user-name command to be executed
系統性cron任務由7個字段組成:
前5個字段:時間點
user-name:計劃時間點以哪個用戶運行程序;
command to be executed:要運行的任務;
時間表示法:
*,表示該時間字段取值範圍內的所有值
-:一個特定連續時間範圍;3-7
,:一個離散的時間點,1,3,4,5
/#:有限時間範圍內的每多少時間,用於指定頻率;
注意:day of month ,month 兩個時間點一般不與day of week同時使用
例:
[root@pizi mail]# crontab -l 5 */3 * * * root /bin/echo "hello world!"
表示每3個小時的第5分鐘執行一次echo "hello world"命令
b、用戶cron任務:由某個用戶所提交,默認就是以提交者的身份運行,無需額外執行運行者:
# 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)
# | | | | |
# * * * * * command to be executed
此處的模式跟系統cron任務唯一不同的是此處不用指定運行用戶了。其他都同上
c、crontab命令的用法:
crontab [-u user] [-l|-r|-e]
-u user:不是管理自己的cron任務,而是指定的目標用戶的cron任務,僅root擁有管理其他用戶的cron任務的權限,默認管理自己的;
-l:list 列出任務;
-r:remove,移除所有任務;
-e:edit,編輯,打開一當前shell回話的默認編輯器來編輯cron任務表;
d、注意:
1)、如果不想接收任務執行結果的通知郵件:
command > /dev/null :表示不接收執行任務正確的郵件通知
command &> /dev/null :表示不接收所有的郵件通知
2)、對於crontab文件來講,%有特殊的功用,如果命令中出現了%,要記得轉義,或者用單引號對其引用;
3)、crondtab的path變量與用戶的變量不完全相同,所以建議在cron中的任務要使用絕對路徑來執行
二、練習:
1、每週一到週六的凌晨3點20分,運行cp命令對/etc/目錄進行歸檔另存,存儲位置爲/backups/etc-YYYY-MM-DD;
[root@pizi backups]# crontab -l 20 3 * * 1-6 /bin/cp -af /etc/ /backups/etc-$(date +\%F)
2、每週日凌晨2點30分,運行cp命令對/etc/fstab文件進行備份,存儲位置爲/backup/fstab-YYYY-MM-DD-hh-mm-ss
[root@pizi backups]# crontab -l 20 3 * * 1-6 /bin/cp -af /etc/ /backups/etc-$(date +\%F) 30 2 * * 0 /bin/cp -af /etc/fstab /backups/fstab-$(date +\%F-\%H-\%M-\%S)
3、每天晚上12點,取得/proc/meminfo文件中所有以S或M開頭的行,追加至/statistics/meminfo.txt文件中,且每天的消息之前,要加上類似===============分隔線;
[root@pizi statistics]# crontab -l 20 3 * * 1-6 /bin/cp -af /etc/ /backups/etc-$(date +\%F) 30 2 * * 0 /bin/cp -af /etc/fstab /backups/fstab-$(date +\%F-\%H-\%M-\%S) 0 23 * * * (/bin/echo "============";/bin/egrep "^(S|M)" /proc/meminfo) >> /statistics/meminfo.txt