通过任务计划,可以让系统自动的按时间或周期性任务执行任务

 

环境准备

[root@centos8 ~]#yum -y install postfix
[root@centos8 ~]#systemctl enable --now postfix

 

未来的某时间点执行一次任务

  • at 指定时间点,执行一次性任务
  • batch 系统自行选择空闲时间去执行此处指定的任务

周期性运行某任务

  • cron

一次性任务

at 工具

  • 由包 at 提供
  • 依赖与atd服务,需要启动才能实现at任务
  • at队列存放在/var/spool/at目录中,ubuntu存放在/var/spool/cron/atjobs目录下

  • 执行任务时PATH变量的值和当前定义任务的用户身份一致

at 命令:

at [option] TIME

常用选项:

-V 显示版本信息
-t time 时间格式 [[CC]YY]MMDDhhmm[.ss]
-l 列出指定队列中等待运行的作业;相当于atq
-d N 删除指定的N号作业;相当于atrm
-c N 查看具体作业N号任务
-f file 指定的文件中读取任务
-m 当任务被完成之后,将给用户发送邮件,即使没有标准输出

at 时间格式:

HH:MM 在今日的 HH:MM 进行,若该时刻已过,则明天此时执行任务
02:00
HH:MM YYYY-MM-DD 规定在某年某月的某一天的特殊时刻进行该项任务
02:00 2016-09-20
HH:MM[am|pm] [Month] [Date]
06pm March 17
17:20 tomorrow
HH:MM[am|pm] + number [minutes|hours|days|weeks], 在某个时间点再加几个时间后才进行该
项任务
now + 5 min
02pm + 3 days

范例:

echo touch /root/at.log | at 9:34

at 任务执行方式:

  • 交互式
  • 输入重定向
  • at -f file

/etc/at.{allow,deny} 控制用户是否能执行at任务

  • 白名单:/etc/at.allow 默认不存在,只有该文件中的用户才能执行at命令
  • 黑名单:/etc/at.deny 默认存在,拒绝该文件中用户执行at命令,而没有在at.deny 文件中的使用者则可执行
  • 如果两个文件都不存在,只有 root 可以执行 at 命令

周期性任务计划 cron

周期性任务计划cron相关的程序包:

  • cronie:主程序包,提供crond守护进程及相关辅助工具
  • crontabs:包含CentOS提供系统维护任务
  • cronie-anacron:cronie的补充程序,用于监控cronie任务执行状况,如:cronie中的任务在过去该运行的时间点未能正常运行,则anacron会随后启动一次此任务

cron 依赖于crond服务,确保crond守护处于运行状态:

#CentOS 7 以后版本:
systemctl status crond
#CentOS 6:
service crond status

cron任务分为

  • 系统cron任务:系统维护作业,/etc/crontab 主配置文件, /etc/cron.d/ 子配置文件
  • 用户cron任务:保存在 /var/spool/cron/USERNAME(ubuntu 系统存放在/var/spool/cron/crontabs/USERNAME),利用 crontab 命令管理

计划任务日志:/var/log/cron

用户计划任务

  • 每个用户都有专用的cron任务文件:/var/spool/cron/USERNAME
  • 默认标准输出和错误会被发邮件给对应的用户,如:wang创建的任务就发送至wang的邮箱
  • root能够修改其它用户的作业
  • 用户的cron 中默认 PATH=/usr/bin:/bin,如果使用其它路径,在任务文件的第一行加PATH=/path或者加入到计划任务执行的脚本中
  • 第六个字段指定要运行的命令。 该行的整个命令部分,直至换行符或“%”字符,指定的shell执行.除非使用反斜杠(\)进行转义,否则该命令中的“%”字符将变为换行符,并且第一个%之后的所有数据将作为标准输入发送到该命令。

crontab命令格式:

crontab [-u user] [-l | -r | -e] [-i]

常用选项:

-l 列出所有任务
-e 编辑任务
-r 移除所有任务
-i 同-r一同使用,以交互式模式移除指定任务
-u user 指定用户管理cron任务,仅root可运行

控制用户执行计划任务:
/etc/cron.{allow,deny}

添加默认编辑器 (默认为vi)

#CentOS
[root@CentOS8-8 ~]# vim /etc/profile.d/env.sh PS1='\[\e[1;34m\][\u@\h \W]\$ \[\e[0m\]' export EDITOR=vim
#ubunt

root@ubuntu18-19:~# vim .profile

# ~/.profile: executed by Bourne-compatible login shells.

if [ “$BASH” ]; then
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
fi

mesg n || true
export EDITOR=vim

 

 

定制计划常用选项:任务  每十分钟执行扫描磁盘脚本

crontab -e

 

在脚本中指定PATH变量
[root@centos8 ~]#crontab -l
* * * * * /data/test.sh
[root@centos8 ~]#cat /data/test.sh
#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
useradd hehe
echo $PATH
[root@centos8 ~]#cat /usr/bin/disk_check.sh
#!/bin/bash
#
#********************************************************************
#Author: wangxiaochun
#QQ: 29308620
#Date: 2020-05-08
#FileName: disk_check.sh
#URL: http://www.wangxiaochun.com
#Description: The test script
#Copyright (C): 2020 All rights reserved
#********************************************************************
WARNING=10
df | sed -En '/^\/dev\/sd/s@^([^ ]+).* ([0-9]+)%.*@\1 \2@p'| while read DEVICE
USE;do
[ $USE -gt $WARNING ] && echo "$DEVICE will be full,USE:$USE" | mail -s
diskfull root
done
[root@centos8 ~]#crontab -l
*/10 * * * * check_disk.sh

范例2

[root@centos8 ~]#cat check_disk.sh
#!/bin/bash

df | awk -F ' +|%' '/^\/dev\/sd/{if($5 > 10){system("echo "$1" will be
full,use:" $5 "| mail -s warning root@wangxiaochun.com")} }'
[root@centos8 ~]#crontab -l
*/10 * * * * /root/check_disk.sh

范例3

[root@centos8 ~]#cat check_disk2.sh
#!/bin/bash
WARNING=2
df | awk -F ' +|%' '/^\/dev\/sd/{print $1,$5}'|while read DISK USE;do
if [ $USE -gt $WARNING ];then
echo "$DISK will be full,use:$USE" | mail -s diskwarning
root@wangxiaochun.com
fi
done
[root@centos8 ~]#crontab -l
*/10 * * * * /root/check_disk2.sh

 

范例:

[root@centos8 ~]#man 5 crontab
For example, "0-23/2" can be used in the 'hours' field to specify command
execution for every other hour (the alternative in the V7 standard is
"0,2,4,6,8,10,12,14,16,18,20,22")

#例如,“0-23/2”可以用在
#'hours'字段指定每隔一个小时执行一次命令(在V7标准为“0、2、4、6、8、10、12、14、16、18、20、22”)。

 

 

范例:每个月日期和星期几字段的关系

[root@centos8 ~]#man 5 crontab
Note: The day of a command's execution can be specified in the following two
fields — 'day of month', and 'day of week'. If both fields are restricted
(i.e., do not contain the "*" character), the command will be run when either
field matches the current time. For example, "30 4 1,15 * 5" would cause a
command to be run at 4:30 am on the 1st and 15th of each month, plus every
Friday.

注意:命令的执行日期可以在以下两个字段中指定——‘day of’month和day of week。如果两个字段都被限制(即不包含“*”字符‐acter),命令将在任意字段与当前时间匹配时运行。例如,“30 4 1,15 * 5”将导致在每个月1日和15日凌晨4:30运行命令,加上每个星期五。




计划任务默认的PATH变量太少在开头添加变量PATH

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

 

 面试题:11月每天的6-12点之间每隔2小时执行/app/bin/test.sh

[root@centos8 ~]#crontab -l
0 6-12/2 * 11 * /app/bin/test.sh

cron任务中不建议使用%,它有特殊用途,它表示换行的特殊意义,且第一个%后的所有字符串会被将
成当作命令的标准输入,如果在命令中要使用%,则需要用 \ 转义
注意:将%放置于单引号中是不支持的

范例: 在crontab中%的用法

30 2 * * * /bin/cp -a /etc/ /data/etc`date +\%F_\%T`
30 2 * * * /bin/cp -a /etc/ /data/etc`date +‘%F_%T’` 有问题

范例: 在crontab中%的用法

[root@centos8 ~]#crontab -l
* * * * * mail -s "test" wang%wang,%%how are you?%
[root@centos8 ~]# cat /var/spool/mail/wang
From root@centos8.localdomain Sat Jul 4 23:58:01 2020
Return-Path: <root@centos8.localdomain>
X-Original-To: wang
Delivered-To: wang@centos8.localdomain
Received: by centos8.localdomain (Postfix, from userid 0)
id 0B03860272; Sat, 4 Jul 2020 23:58:01 +0800 (CST)
Date: Sat, 04 Jul 2020 23:58:01 +0800
To: wang@centos8.localdomain
Subject: test
User-Agent: Heirloom mailx 12.5 7/5/10
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Message-Id: <20200704155801.0B03860272@centos8.localdomain>
From: root@centos8.localdomain (root)
wang,
how are you?
[root@centos8 ~]#

 

版权声明:本文为will-原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/will-/p/14266220.html