1. 程式人生 > >謝煙客---------Linux之郵件服務及任務計劃執行

謝煙客---------Linux之郵件服務及任務計劃執行

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

)發郵件,直接發送郵件給smtp服務器,smtp解析目標域名,將郵件發給對方的發郵件服務器(smtp)

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)管理員不能接收 普通用戶的郵件

# mail


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

# mail

> 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之郵件服務及任務計劃執行