一、作业管理

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次任务,这种一般使用atbatch命令。还有一种是需要周期性的运行某个任务,这种一般使用cron

1. at命令

指明一个时间点运行任务,可是直接使用at跟一个时间点,接着at命令会打开一个二级命令行,每一行输入一个需要执行的命令,输入完毕后使用ctrl+d提交,命令的运行结果会以邮件的方式发送给作业提交者。作业还有作业队列,使用at -l命令可以看到a、b这样的队列号
命令格式:at [option] TIME

option
-l:查看作业列表
-q QUEUE_NUM:查看指定队列的作业
-d #:删除指定作业
-c #:显示具体作业的详细情况
-f /path/file/:从指定的文件中读取任务
TIME
HH:MM[yyyy-mm-dd] :指定几点几分
noon,midnight,teatime:中午12点、夜里12点、下午4点
tomorrow:明天
now+#{minutes,hours,days,weeks}:相对时间表示法

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,文件内需要遵循特定格式

# .---------------- 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

3.3 时间的表示方法

  • 特定值:给定的数值
  • *:当前时间点范围内的所有值
  • 离散取值:使用逗号分割,例如10,20,30
  • 连续取值:使用横线,如10-20
  • 步长:/#, 例如*/#20-50/3.

3.4 用户cron任务

用户定义cron任务需要使用crontab命令定义,每个用户都有专用的cron任务文件/var/spool/cron/USERNAME,用户自行定义的任务就无需指定用户名称了,运行结果会以邮件通知给相关用户
命令格式:crontab [option]

option
-e:编辑任务
-l:列出任务
-r:移除所有任务
-i:交互式模式让用户移除指定用户,需结合-r使用
-u:为某个用户指定cron任务,仅root可执行
  • 邮件重定向
    如果运行没有问题,可以使用重定向丢弃邮件COMMAND > /dev/nullCOMMAND &> /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

option
-s string:指明邮件主题
-a file:指定附件
-c address:指明抄送给谁
-b address:指明密送给谁

邮件正文生成有三种方式

  • 方式一:使用命令mail -s 'hello' zhangsan后,直接键入邮件正文,完毕后按Ctrl+d提交,就完成发送了
  • 方式二:可是使用一个文件当邮件正文,比如利用输入重定向结合mail命令 mail -s 'hello' zhangsan < file.txt
  • 方式三:使用echo命令结合管道送给mail命令也可以实现echo 'hello' | mail -s 'hello' zhangsan

四、练习

  1. 每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
  2. 每周二、四、日备份/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
  3. 每两小时取出当前系统/proc/meminfo/文件中以S或M开头的信息追加至/tmp/meminfo.txt文件中
    0 */2 * * * root /usr/bin/grep '^[SM]' /proc/meminfo >> /tmp/meminfo.txt
  4. 工作日时间内,每小时执行一次ip addr show命令
    0 */1 1-5 * * /usr/sbin/ip addr show

五、tips

在linux系统中,查找命令的路径都是根据PATH环境变量定义的,这里要注意的是,我们定义的作业及任务计划,它们查找命令的PATH环境变量很有可能和用户登录时使用的PATH环境变量不一样,所以解决方式有两种,方式一是定义作业的时候,命令都写明绝对路径,方式二是自行定义一个导出环境变量的脚本,每次计划任务前先去导出这个变量脚本