謝煙客---------Linux之郵件服務及任務計劃執行
任務計劃命令
mail,at,batch,crond,sleep
郵件服務工作模式:
發 代理-> stmp --> smtp --> 投遞代理 --> 郵筒 --> pop3,imap4 <-- 代理 <-- 收
at,mail,batch,cron命令均建議用完整路徑或在腳本中定義PATH
特點:
mail -s ‘主題‘ [email protected] 發郵件
batch 根據負載選定命令執行時間
at HH:MM am|pm [YYYY-MM-DD] 到點支行內容中的命令
內容生成:
mail 不支持-f FILE生成內容。 at 支持 -f FILE運行文件中的命令
支持管道: echo "STRING" | COMMAND
支行輸入重定向: COMMAND < file
普通ctrl + d
1)到點下載(at)或內核決策下載(batch)
2)定期備份(crontab)
3)磁盤滿了給root發mail(mail -s ‘‘ root)
每晚0點檢查磁盤是否容量是否達到40%
0 0 * * * root /bin/echo -e "$(/bin/df -hP | /bin/grep -v ^Filesystem | /bin/awk -v percent=40 ‘{split($5,ARRAY,"\%"); if (ARRAY[1] >= percent){A[$NF]++}}END {for (i in A) {print i}}‘) \n amost full" | /bin/mail -s ‘hello xue‘ root
sleep #{s,m,h}
周期性任務計劃位置: /etc/crontab, /var/spool/cron/USERNAME(普通用戶不可讀寫)
格式:
/etc/crontab
* * * * * username command
/var/spool/cron/USERNAME
* * * * * command
郵件服務
mail 監聽端口 53/127.0.0.1 監聽在本機只能本機的用戶通信
smtp: 郵件傳輸協議:發郵件服務,支持投遞代理
pop3: 郵局協議:收郵件服務
imap4: 收郵件服務
工作模式:
1、發郵件:本地客戶端代理(foxmail,uplook
2、收郵件:本地的發郵件服務器(smtp)通過投遞代理將郵件投遞至對應用戶的郵筒中,對方用戶用本地代理(foxmail,uplook,linux雷鳥)接收郵件,連接收郵件服務器(pop3,imap4)並檢索郵筒,取出郵件
郵筒:(更強大:mail dir , mail box)
/var/spool/mail/USERNAME
發郵件命令
mail -s ‘主題‘ [email protected]
郵件正文格式
1、交互寫完,Ctrl + d
2、非交互, mail -s ‘主題‘ < file
3、非交互, echo "內容" | mail -s ‘主題‘ [email protected]
查看郵件:
# mail 查看所有郵件
# num 查看指定號碼郵件
退出: q
使用示例
1、方法一
1)給root發郵件
# mail -s ‘hello‘ [email protected]
hello everyone.. ## 輸入郵件正文
EOT ## 輸入完畢,。“Ctrl + d"提交操作
2)mail 查看郵件
# mail
>N 1 root Thu Aug 24 21:58 18/617 "hello"
3)顯示第一封郵件
& 1
hello everyone.. ## 郵件的具體內容
2、方法二
1)給root發郵件
# echo ‘內容‘ | mail -s ‘標題‘ [email protected]
2)mail 查看郵件
# su - gentoo -c ‘mail‘
>>N 1 root Thu Aug 24 22:04 18/625 "標題"
3)顯示第一封郵件
& 1
內容
4)管理員不能接收 普通用戶的郵件
3、方法三
1)給root發郵件
# echo timezone > /tmp/file
# mail -s ‘標題‘ [email protected] < /tmp/file
2)mail 查看郵件
# su - gentoo -c ‘mail‘
1 root Thu Aug 24 22:04 19/636 "標題"
>N 2 root Thu Aug 24 22:17 18/630 "標題"
3)顯示第二封郵件
& 2
timezone
4)管理員不能普通用戶的郵件
& 2
> 1 root Thu Aug 24 21:58 19/628 "hello"
at,batch,crond實現方式
1、at:在確定時間點執行一次
2、batch:在負載小時執行
3、crontab或/etc/crontab: 在確定時間點執行N次
目的:重復的事情,將來某時刻要做的事情,可以通過周期任務計劃完成
1)如果有自己喜歡的電影,公司服務器,晚上訪問量小,帶寬使用小,此時用個at讓晚上下載一個"戰狼2",第二天來看。或白天用batch命令,下載,讓內核決定什麽時候下載。
2)如何每天0點對數據庫備份或etc目錄備份。對於每天重復的事情crontab可以解決
3)磁盤滿了給root發mail
at命令
at [OPTIONS...] TIME
TIME: HH:MM [AM|PM] [YYYY-MM-DD] now +#{minutes,hours,days,weeks} today,tomorrow -t [[CC]YY]MMDDDhhmm midnight,noon,teatime (4pm) 選項: -q QUEUE 小寫隊列由at模式執行,大寫隊列由batch模式執行。[a-z][A-Z] # at -q b TIME (at) # at -q B (batch) -l 相當於 atq 列出等待運行的作業 -d job_num 相當於 atrm 刪除指定的作業 -c job_num 顯示指定作業執行結果及相關變量 -f FILE 從文件讀取命令 -m 默認發郵件,即使沒有輸出也發郵件 -M 不發郵件給用戶 -v 顯示任務何時執行 註意: 1、at 中的PATH不是繼承bash中的PATH: 1)命令給出完整路徑。 2)at運行腳本,腳本中定義PATH,用不完整的路徑。 2、如果/etc/at.allow文件存在,(白名單)僅有定義在此文件中的用戶可以使用at 如果at.allow不存在: /etc/at.deny存在:(黑名單)僅定義在此文件中的用戶不可以使用at /etc/at.deny不存在,所有普通用戶可使用at (***以上對管理員root無效)
batch命令 內核探測到系統負載低於0.8時或低於由atd指定的百分比時才執行命令(由內核決定什麽運行,類似於異步IO)
使用示例
時間表示法,今晚12:00下載.9999....
寫出時間用-v命令確認任務執行的時間
# at -v 0am 2017-08-25 Fri Aug 25 00:00:00 2017
1)方法一
# at -v 0am 2017-08-25 at> /usr/bin/wget -c -P /PRIMARY http://dl135.80s.im:920/1708/戰l2[高清搶先版]/戰l2[高清搶先版].mp4 > /dev/null at> <EOT> ---------------------------------------- 此命令表示CTRL + d job 2 at 2017-08-25 00:00
2)方法二
# /bin/echo " /usr/bin/wget -c -P /PRIMARY http://dl135.80s.im:920/1708/戰l2[高清搶先版]/戰l2[高清搶先版].mp4 &> /dev/null" | at 0am 2017-08-25 job 7 at 2017-08-25 00:00
3)方法三
1、將命令寫入文件 # echo "/bin/echo 123" > /tmp/file 2、重定向標準輸入 # at now < /tmp/file 3、查詢 # mail >N 4 root Thu Aug 24 22:34 14/491 "Output from your job 6" N 5 root Thu Aug 24 22:36 14/491 "Output from your job 8" 4、查看序號5 & 5 123 5、退出 & q
# batch
at> /usr/bin/wget -c -P /root/ZhanLang_2 http://dl135.80s.im:920/1708/戰l2[高清搶先版]/戰l2[高清搶先版].mp4 > /dev/null
at> <EOT>
job 11 at 2017-08-24 22:45
周期性任務計劃
任務類型
系統任務: /etc/crontab
用戶任務: crontab -e (/var/spool/cron/USERNAME,普通用戶不可讀,寫)
為什麽普通用戶沒有對/var/spool/cron/USERNAME,box的讀寫權限仍可以修改文件呢?
1、suid?
2、普通用戶使用crond服務提供的命令,crontab,而服務進程的屬主是root,註意前方高能...............................
運行crontab為一個進程,進程屬主為root,文件僅對root有讀寫權限。進程的安全上下文件中說明“用戶對文件的權限,取決於用戶運行命令為進程後,進程屬主對文件的權限 / 進程對文件的權限取決於 發起進程的用戶” 有什麽區別?
crond服務或crontab命令由哪些程序包所提供
# rpm -q --whatprovides /usr/bin/crontab
cronie-1.4.4-16.el6_8.2.i686
# rpm -qa | fgrep cron
cronie:主程序包,提供cron守護進程及相關輔助工具
cronie-anacron:補充程序包,監控cronie任務執行狀況:如cronie中的任務在過去時間點未能正常運行,則anacon會隨後啟動一次此任務。
crontabs: 系統維護任務,提供任務文件或目錄
系統任務
SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin ## 在當前文件中定義的任務可以在這些文件中查找命令 MAILTO=root ## 郵件發給誰 HOME=/ # 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
username 以指定用戶的身份
command 被指定用戶執行命令
時間點表示方式
1、精確: #
2、離散(線性地址和物理地址):1,3,5
3、連續:1-5
4、步長:*/5 每5小時, 20-50/5:第20-50分鐘內每5分鐘
使用示例
以root身份運行命令,每分鐘
SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # * * * * * user-name command to be executed * * * * * root /bin/echo /bin/date +"\%F \%T" >> /root/a.txt
tail -f /root/a.txt 2017-08-24-23:13:01 2017-08-24-23:14:01 2017-08-24-23:15:01 2017-08-24-23:16:01
以root身份運行命令,每小時的21,23,24分鐘
23,21,24 * * * * root /bin/echo `/bin/date +"\%F-\%T"` >> /root/b.txt
tail -f /root/b.txt 2017-08-25-00:21:01 2017-08-25-00:23:01 2017-08-25-00:24:01
以root身份運行命令,每小時1-3分鐘
53-55 * * * * root /bin/echo `/bin/date +"\%F-\%T"` >> /root/c.txt
tail -f c.txt 2017-08-25-00:53:01 2017-08-25-00:54:01 2017-08-25-00:55:01
以root身份運行命令,在57-59分鐘內每分鐘。
57-59 * * * * root /bin/echo `/bin/date +"\%F-\%T"` >> /root/d.txt
2017-08-25-00:57:01 2017-08-25-00:58:01 2017-08-25-00:59:01
用戶任務
# 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 # | | | | | # * * * * * command to be executed
**任務格式,與/etc/crontab文件,不能指定用戶身份
1、保證crond服務運行
6 service crond status
7 systemctl status crond.service
2、編輯任務
系統: vim /etc/crontab
用戶: crontab -e
3、查看任務
crontab -l
4、刪除單個任務..................................(再編輯)
5、清空任務
crontab -r
6、交互式清除任務
crontab -r -i
註意:
1、每個crontab命令定義任務執行的結果後,同at會發給root用戶
只接收執行錯誤的內容:COMMAND > /dev/null
保證命令準確,路徑完整:COMMAND &> /dev/null (都不收)
2、命令中不可以直接使用%,需要轉義, \% 或 ‘%‘
3、crontab中定義的命令從crontab自帶的PATH變量中查找
定義在/etc/crontab中
4、root用戶可以管理普通用戶的任務計劃
crontab命令
-u USER 僅root可運行,為指定用戶管理cron任務;
-i/-r/-l/-e
使用示例
以root身份運行命令
在root用戶登陸界面下,crontab即可
[[email protected] ~]# crontab -e PATH=/bin:/sbin:/usr/bin:/usr/sbin * * * * * echo `date +%F_%T` >> ~/tmp/a.file [[email protected] ~]# tail -f tmp/a.file 2017-08-25_14:50:01 2017-08-25_14:51:01 2017-08-25_14:52:01 2017-08-25_14:53:01
以gentoo用戶運行命令,
[[email protected] ~]# crontab -e * * * * * /bin/echo $(date +\%F_\%T) >> ~/tmp/a.file [[email protected] ~]# crontab -u gentoo -e [[email protected] ~]# crontab -u gentoo -l * * * * * /bin/echo 12345678899000 | /bin/mail -s ‘標題‘ root 回到root,過1分鐘,查看mail [[email protected] ~]# mail 12345678899000
本文出自 “Reading” 博客,請務必保留此出處http://sonlich.blog.51cto.com/12825953/1959468
謝煙客---------Linux之郵件服務及任務計劃執行