Linux作业控制、定时任务计划、系统自带的邮件服务
一、作业管理
1. 作业类别
- 前台作业:通过终端启动,运行时占据命令行的作业
- 后台作业:启动后转入后台,释放命令行
虽然被送往后台运行,但其依然与终端相关,如果希望送往后台后剥离与终端的关系,在命令前加nohup
2. 作业调度
2.1 将作业由前台送往后台
- 运行中的作业:
Ctrl+z
- 尚未启动的作业:
COMMAND &
- 剥离与终端的关系:
nohup COMMAND &
2.2 将作业由后台调回前台
fg [[%]JOB_NUM]
:将后台作业调回前台,%有时不可省略bg [[%]JOB_NUM]
:让后台作业继续运行kill [%JOB_NUM]
:杀死指定后台任务,%不能省略,因为要区分指定的不是进程号
2.3 查看作业
命令格式:jobs [#]
|
二、周期任务计划
任务计划实现的方式有两种,一种是在未来的某个时间点执行1次任务,这种一般使用at
或batch
命令。还有一种是需要周期性的运行某个任务,这种一般使用cron
1. at命令
指明一个时间点运行任务,可是直接使用at
跟一个时间点,接着at
命令会打开一个二级命令行,每一行输入一个需要执行的命令,输入完毕后使用ctrl+d
提交,命令的运行结果会以邮件的方式发送给作业提交者。作业还有作业队列,使用at -l
命令可以看到a、b这样的队列号
命令格式:at [option] TIME
|
|
2. batch命令
让系统自行选择空闲时间去指定此处指定的任务
3. crone命令
3.1 crone命令相关的程序包
- cronie:主程序包,提供了crond守护进程及相关辅助工具
- cronie-anacron:cronie的补充程序,用于监控cronie任务执行状况,如果cronie中的任务在定义的时间点没能执行,则anacron会启动一次任务
- crontabs:包含centos系统维护任务
所有功能都是依赖crond守护进程才能完成的,所以必须确保crond守护进程处于运行状态,使用命令systemctl status crond
查看croned守护进程的运行状态
3.2系统cron任务
用来定义系统维护作业,文件位置/etc/crontab
,文件内需要遵循特定格式
|
3.3 时间的表示方法
- 特定值:给定的数值
- *:当前时间点范围内的所有值
- 离散取值:使用逗号分割,例如
10,20,30
- 连续取值:使用横线,如
10-20
- 步长:
/#
, 例如*/#
、20-50/3
.
3.4 用户cron任务
用户定义cron任务需要使用crontab命令定义,每个用户都有专用的cron任务文件/var/spool/cron/USERNAME
,用户自行定义的任务就无需指定用户名称了,运行结果会以邮件通知给相关用户
命令格式:crontab [option]
|
- 邮件重定向
如果运行没有问题,可以使用重定向丢弃邮件COMMAND > /dev/null
或COMMAND &> /dev/null
- tips:对于cron任务来讲,%有特殊用途,如果命令中要使用%则需要转义,不过放在单引号中,也可以不用转义
3.5 特殊时间点
- cron最小的时间步长是分钟,那么如果想运行在秒级别,可以在命令处定义一个循环,然后结合sleep命令完成
* * * * * for i in 1 2 3; do echo “123”; sleep 20; done
- 同理,一些不能被整除的数字,都可以用sleep命令来做频次控制,如每7分钟执行一个命令
0 * * * * for i in {1..9}; do echo 'hello' ;sleep 7m; done
3.6 示例
- 示例一:每天晚上9:10运行echo命令
10 21 * * * root /usr/bin/echo 'hello' > /file.txt
. - 示例二:每三小时执行一次任务
1 */3 * * * root /command
这里需要注意的是,如果在较大时间内定义一个值,那么较小时间必须给定一个值,比如示例二的错误版本* */3 * * * root /command
,这表示每到三个小时,在那个小时中每分钟都执行一遍命令
三、Linux系统自带邮件服务的简单应用
1. 互联网邮件系统的工作模式
互联网上的邮件服务系统是相当复杂的,现在也很少有个人去搭建邮件服务器,这里我试着简单的讲一讲邮件服务器的工作模式。
想能够发邮件,就需要先找一个写邮件的地方,这个写邮件的地方叫做MUA(邮件用户代理),个人桌面常见比如foxmail客户端工具、outlook客户端工具。有了用户代理,编好邮件点发送就可以了,点发送也就意味着要连到你的smtp服务器,由你的smtp服务器通过dns解析找到对方收邮件的服务器,那么对方的邮件服务器收到后发现收件人就是本地的,它就会通过MDA(邮件投递代理)把邮件投放到对应用户的邮筒中,将来收件人打开自己的邮件用户代理工具,比如使用pop3协议的客户代理工具,就可以连接到用户的邮筒中帮用户去检索邮件
2. 邮件服务协议
- smtp:simple mail transmission protocol,简单邮件传输协议,主要作用就是传送邮件,功能比较简单
- pop3:Post office Protocol,邮局协议
- imap4:Internet Mail Access Protocol,互联网邮件访问协议
3. Linux主机的邮件服务功用
Linux系统的每一台主机,它内部都有很多日常维护工作,维护结果需要通知给相关用户,就需要用到邮件服务,一般情况下当你装完系统后,邮件服务都会默认安装并启动起来,使用命令ss -tnl
命令如果可以看到25号端口处于监听状态,就说明邮件服务已经启用了。充当邮筒功用的是/var/spool/mail
目录,每个用户都有一个同名的目录用来存放邮件,当用户查看完自己的邮件,这个邮件就会自动移动到自己的家目录中
4. mail命令
自带的mail命令就是一个简单的用户代理工具,不带任何参数mail命令就可以查看自己的邮筒,键入邮件编号就可以查看对应邮件,完毕后使用q键退出
命令格式:mail [option] username
|
邮件正文生成有三种方式
- 方式一:使用命令
mail -s 'hello' zhangsan
后,直接键入邮件正文,完毕后按Ctrl+d
提交,就完成发送了 - 方式二:可是使用一个文件当邮件正文,比如利用输入重定向结合mail命令
mail -s 'hello' zhangsan < file.txt
- 方式三:使用echo命令结合管道送给mail命令也可以实现
echo 'hello' | mail -s 'hello' zhangsan
四、练习
- 每4小时备份一次
/etc
目录至/backup
目录中,保存的文件名格式为/etc-yyyy-mm-dd-hh.tar.xz
方式1:定义在配置文件中
* */4 * * * root /usr/bin/tar -Jcf "/backup/`date +%F-%H`.tar.xz" /etc
方式2:定义在脚本中
0 */4 * * * /bin/bash /root/back_etc.sh
#!/bin/bash
#
time=$(date +%F-%T)
tar Jcf /backup/etc-${time}.tar.xz /etc - 每周二、四、日备份
/var/log/messages
文件至/logs
目录中,文件名messages-yyyymmdd
方式1:定义在配置文件中
0 0 * * 2,4,7 root /usr/bin/tar zcf "/logs/messages-`date +%Y%m%d`.tar.gz" /var/log/messages
方式二:定义在脚本中
0 0 * * 0,2,4 /bin/bash /root/back_messages.sh
#!/bin/bash
#
time=$(date +%F)
tar Jcf /log/messages-${time}.tar.xz /var/log/messages - 每两小时取出当前系统
/proc/meminfo/
文件中以S或M开头的信息追加至/tmp/meminfo.txt
文件中
0 */2 * * * root /usr/bin/grep '^[SM]' /proc/meminfo >> /tmp/meminfo.txt
- 工作日时间内,每小时执行一次ip addr show命令
0 */1 1-5 * * /usr/sbin/ip addr show
五、tips
在linux系统中,查找命令的路径都是根据PATH环境变量定义的,这里要注意的是,我们定义的作业及任务计划,它们查找命令的PATH环境变量很有可能和用户登录时使用的PATH环境变量不一样,所以解决方式有两种,方式一是定义作业的时候,命令都写明绝对路径,方式二是自行定义一个导出环境变量的脚本,每次计划任务前先去导出这个变量脚本