Linux之邮件服务及任务计划执行

简介:

任务计划命令

mail,at,batch,crond,sleep

邮件服务工作模式

发 代理-> stmp --> smtp --> 投递代理 --> 邮筒 --> pop3,imap4 <-- 代理 <-- 收

at,mail,batch,cron命令均建议用完整路径或在脚本中定义PATH

特点:

mail -s '主题' username@localhost 发邮件

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%

1
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(普通用户不可读写)

crond守护进程实时处于运行状态,不断去检测配置文件中有没有哪个任务到了该执行的时间,如果有就将此任务执行一次,并将执行的结果通过邮件发送给相关的用户(有缺陷,anacron负责补充)


cronie-anacron:对cron补充程序,监控cronie任务执行状况:如果cronie中的任务在过去时间点未能正常运行,则anacon会随后启动一次此任务。(服务器不关机,可不用。笔记本,应该使用此辅助机制)


格式:

    /etc/crontab

        * * * * *  username command

   /var/spool/cron/USERNAME

        * * * * *  command

日志: /var/log/rsyslog

使用时保证rsyslog服务启动: service rsyslog start



邮件服务

    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 '主题' USERNAME@HOST

    邮件正文格式    

        1、交互写完,Ctrl + d

        2、非交互, mail -s '主题' < file 

        3、非交互, echo "内容" | mail -s '主题' USERNAME@HOST 

    

    查看邮件: 

        # mail 查看所有邮件

        # num  查看指定号码邮件 

    退出: q



使用示例


1、方法一 

    1)给root发邮件

        # mail -s 'hello' root@localhost  

        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 '标题' gentoo@localhost


    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 '标题' gentoo@localhost < /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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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命令确认任务执行的时间

1
2
# at -v 0am 2017-08-25
Fri Aug 25 00:00:00 2017


1)方法一

1
2
3
4
# 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)方法二

1
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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: 系统维护任务,提供任务文件或目录

    

系统任务

1
2
3
4
5
6
7
8
9
10
11
12
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身份运行命令,每分钟

1
2
3
4
5
6
7
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
1
2
3
4
5
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分钟

1
23 , 21 , 24  * * * * root /bin/echo `/bin/date + "\%F-\%T" ` >> /root/b.txt
1
2
3
4
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分钟

1
53-55 * * * * root  /bin/echo  ` /bin/date  + "\%F-\%T" ` >>  /root/c .txt
1
2
3
4
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分钟内每分钟。

1
57-59 * * * * root  /bin/echo  ` /bin/date  + "\%F-\%T" ` >>  /root/d .txt
1
2
3
2017-08-25-00:57:01
2017-08-25-00:58:01
2017-08-25-00:59:01


用户任务

1
2
3
4
5
6
7
8
# 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、删除单个任务..................................(j_0023.gif再编辑)  

    

    5、清空任务

        crontab -r


    6、交互式清除任务

        crontab -r -i


    注意:

        1、每个crontab命令定义任务执行的结果后,同at会发给root用户

             只接收执行错误的内容:COMMAND > /dev/null

             保证命令准确,路径完整:COMMAND &> /dev/null (都不收)


        2、命令中不可以直接使用%,需要转义, \% 或 '%'

    

        3、建议用绝对路径,或使用文件额外定义PATH变量或定义在crontab文件中

            crontab文件PATH定义在/etc/crontab中

            普通用户PATH定义在crontab -e 打开的文件中


        4、root用户可以管理普通用户的任务计划


    crontab命令

        -u USER 仅root可运行,为指定用户管理cron任务;

        -i/-r/-l/-e


使用示例

以root身份运行命令

在root用户登陆界面下,crontab即可

1
2
3
4
5
6
7
8
[root@localhost ~] # crontab -e
PATH= /bin : /sbin : /usr/bin : /usr/sbin
* * * * *  echo  ` date  +%F_%T` >> ~ /tmp/a . file
[root@localhost ~] # 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用户运行命令, 

1
2
3
4
5
6
7
8
9
10
[gentoo@localhost ~] # crontab  -e
* * * * *  /bin/echo  $( date  +\%F_\%T)  >> ~ /tmp/a . file
 
[root@localhost ~] # crontab -u gentoo -e
[root@localhost ~] # crontab -u gentoo -l
* * * * *  /bin/echo  12345678899000 |  /bin/mail  -s '标题‘ root
 
回到root,过1分钟,查看mail
[root@localhost ~] #  mail
12345678899000










本文转自 lccnx 51CTO博客,原文链接:http://blog.51cto.com/sonlich/1959468,如需转载请自行联系原作者
目录
相关文章
|
4月前
|
Linux
在Linux中,怎么把脚本添加到系统服务里,即用 service 来调用?
在Linux中,怎么把脚本添加到系统服务里,即用 service 来调用?
|
1月前
|
Linux 应用服务中间件 Shell
linux系统服务二!
本文详细介绍了Linux系统的启动流程,包括CentOS 7的具体启动步骤,从BIOS自检到加载内核、启动systemd程序等。同时,文章还对比了CentOS 6和CentOS 7的启动流程,分析了启动过程中的耗时情况。接着,文章讲解了Linux的运行级别及其管理命令,systemd的基本概念、优势及常用命令,并提供了自定义systemd启动文件的示例。最后,文章介绍了单用户模式和救援模式的使用方法,包括如何找回忘记的密码和修复启动故障。
46 5
linux系统服务二!
|
1月前
|
Linux 应用服务中间件 Shell
linux系统服务!!!
本文详细介绍了Linux系统(以CentOS7为例)的启动流程,包括BIOS自检、读取MBR信息、加载Grub菜单、加载内核及驱动程序、启动systemd程序加载必要文件等五个主要步骤。同时,文章还对比了CentOS6和CentOS7的启动流程图,并分析了启动流程的耗时。此外,文中还讲解了Linux的运行级别、systemd的基本概念及其优势,以及如何使用systemd管理服务。最后,文章提供了单用户模式和救援模式的实战案例,帮助读者理解如何在系统启动出现问题时进行修复。
51 3
linux系统服务!!!
|
1月前
|
Linux 数据库
Linux服务如何实现服务器重启后的服务延迟自启动?
【10月更文挑战第25天】Linux服务如何实现服务器重启后的服务延迟自启动?
286 3
|
1月前
|
关系型数据库 MySQL Linux
Linux系统如何设置自启动服务在MySQL数据库启动后执行?
【10月更文挑战第25天】Linux系统如何设置自启动服务在MySQL数据库启动后执行?
116 3
|
2月前
|
Ubuntu Linux 网络安全
Linux中服务管理问题
【10月更文挑战第4天】
30 2
|
2月前
|
应用服务中间件 Linux Shell
Linux 配置 Nginx 服务的详细步骤,绝对干货
Linux 配置 Nginx 服务的详细步骤,绝对干货
97 0
|
3月前
|
NoSQL Linux Redis
Linux Redis 服务设置开机自启动
【9月更文挑战第2天】在 Linux 系统中,可使用两种方法设置 Redis 开机自启动:一是通过创建 `redis.service` 文件并利用 systemd 进行管理,包括定义服务参数和启动脚本;二是编辑 `/etc/rc.local` 文件,在其中添加启动命令。推荐使用 systemd 方法,因为它更符合现代 Linux 系统的设计理念。设置完成后,可通过 `sudo systemctl status redis.service` 检查服务状态。
547 3
|
3月前
|
编解码 Linux 开发工具
Linux平台x86_64|aarch64架构RTMP推送|轻量级RTSP服务模块集成说明
支持x64_64架构、aarch64架构(需要glibc-2.21及以上版本的Linux系统, 需要libX11.so.6, 需要GLib–2.0, 需安装 libstdc++.so.6.0.21、GLIBCXX_3.4.21、 CXXABI_1.3.9)。
|
4月前
|
Ubuntu Linux 测试技术
在Linux中,已知 apache 服务的访问日志按天记录在服务器本地目录/app/logs 下,由于磁盘空间紧张现在要求只能保留最近7天的访问日志,请问如何解决?
在Linux中,已知 apache 服务的访问日志按天记录在服务器本地目录/app/logs 下,由于磁盘空间紧张现在要求只能保留最近7天的访问日志,请问如何解决?