at 单次任务

介绍

at可以设置一个指定的时间执行一个指定任务,只能执行一次,使用前需要确认系统是否开启了atd服务

常用参数

参数 说明
-V 显示版本信息
o 列出指定队列中等待运行的作用,相当于atq
-d 删除指定的作业,相当于atrm
-f 从/path/file中读取任务
-m 当任务完成之后,将给用户发送邮件,即使没有标准输出
ps:作业执行命令的结果中的标准输出和错误以邮件通知给相关用户

定义执行时间

  1. 02:00 2016-09-20
  2. 04pm March 17
  3. 17:20 tomorrow
  4. now+5min
  5. 02pm+3days
  6. 02am+1weeks

注意事项

1.输入完成ctrl+d退出,不是ctrl+c
2.查看/var/spool/at目录中生成了一个文件
3.echo在at中无法在屏幕输出,以邮件方式发送
4./etc/at.{allow,deny}控制用户是否能执行at任务
白名单:/etc/at.allow默认不存在,只有该文件中的用户才能执行at命令

  黑名单:/etc/at.deny默认存在,拒绝该文件中用户执行at命令,而没有在at.deny文件中的使用者则可执行<br />      如果两个文件都存在,allow文件优先<br />      如果两个文件都不存在,只有root用户可以执行at命令<br />5.需要安装包<br />     rpm  -qi at  #查看at包是否安装号<br />     rpm -ql at   #查看at包列表文件<br />     ps -aux | grep atd  #查看atd是否已经在运行<br />6.需要同步时间<br />     ntpdate 
[root@lhuan spool]# ntpdate 172.20.0.1
10 Oct 10:41:01 ntpdate[30863]: the NTP socket is in use, exiting

创建任务

/var/spool/at任务所在文件夹
1.交互式

[root@lhuan ~]# at 11:08
at> date >/root/1.sh
at> <EOT>
job 10 at Sat Oct 10 11:08:00 2020
#执行结果
[root@lhuan ~]# cat 1.sh
Sat Oct 10 11:08:00 CST 2020

at now+1minutes (现在之后1分钟)
at> wall "class is over"
或
at 2:00 (计划任务日志输出隐藏)
at> tar cvf etc.tar /etc &> /dev/null


at 11:08
date >/root/1.sh
<EOT>

2 .重定向

at 2:00 <<EOF 
tar cvf etc.tar /etc &> dev/null
wall "backup is finished"
EOF
计划任务可用多行重定向放在脚本中执行

3.读文件
at -f

cat atjob.txt |at 3:00
或
at -f atjob.txt 3:00 (利用f选项,成功会发送空文件)

还可以把以下内容写入文本atjob.txt中,直接执行文本
`tar cvf etc.tar /etc &> dev/null`
`wall "backup is finished"`

查看任务

at -l 查看任务列表等同于atq
at -c 5 查看5号任务
ls /etc/var/spool/at
[root@lhuan ~]# at -l
8    Sun Oct 11 10:50:00 2020 a root
You have new mail in /var/spool/mail/root

删除任务

at -d 8
或者
atrm -8

crond 周期任务

介绍

crond在linux下用来周期性地执行某种任务或者等待处理某些事件,eg:进程监控 、日志处理等。
当安装系统的时候会默认安装,并且会地总启动crond进程。
crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,就自动执行该任务。crond的最小调度单位为分钟。

分类

系统任务调度和用户任务调度

(1)系统任务调度

系统周期性所要执行的工作
eg:写缓存数据到硬盘、日志清理等。
系统任务调度的配置文件:/etc/crontab

[root@lhuan ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# 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

前三行用来配置crond的任务运行的环境变量
第一行 SHELL变量指定系统要使用哪种shell
第二行 PATH变量指定了系统执行命令的路径
第三行 MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户
后面的行表示使用的时间格式

(2)用户任务调度

用户定期要执行的任务
eg:用户数据备份,定时邮件提醒等。
用户可以使用crontab工具来定制自己的计划任务。
所有用户定义的crontab文件都被保存在/var/spool/cron目录中。文件名和用户名一致。
用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,格式分为6个字段,前5个字段是时间设定段,第6个字段是要执行的命令段
minute hour day month week command

参数 说明
minute 表示分钟,可以是0-59之间的任何整数
hour 表示小时,可以是0-23之间的任何整数
day 表示日期,可以是0-31之间的任何整数
month 表示月份,可以是0-12之间的任何整数
week 表示星期几,可以是0-7之间的任何整数,0或7代表星期日
command 要执行的命令,可以是系统命令,也可以是自己编写的脚本文件
        - 时间表示法:
           - 1.特定时间
              - 在给定的时间范围内去有效的值
           - 2.*
              - 在给定的时候上去有效范围的所有制,’每……‘
           - 3.离散取值
              - 1,3,5,#,#……
           - 4.范围值
              - #-#
           - 5.定义步长,在指定时间范围上,
              - /# :每隔多长时间,#为步长

相关程序包

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

cronie文件

[root@lhuan ~]# rmp -ql cronie
-bash: rmp: command not found
[root@lhuan ~]# rpm -ql cronie
/etc/cron.d
/etc/cron.d/0hourly 每小时任务文件
/etc/cron.deny       黑名单文件
/etc/pam.d/crond
/etc/sysconfig/crond
/usr/bin/crontab        #提交计划任务用的
/usr/lib/systemd/system/crond.service   #服务守护进程
/usr/sbin/crond            #创建任务用的
/usr/share/doc/cronie-1.4.11
/usr/share/doc/cronie-1.4.11/AUTHORS
/usr/share/doc/cronie-1.4.11/COPYING
/usr/share/doc/cronie-1.4.11/ChangeLog
/usr/share/doc/cronie-1.4.11/INSTALL
/usr/share/doc/cronie-1.4.11/README
/usr/share/man/man1/crontab.1.gz
/usr/share/man/man5/crontab.5.gz
/usr/share/man/man8/cron.8.gz
/usr/share/man/man8/crond.8.gz
/var/spool/cron           #任务存放文件夹

开启服务

#设置开机自启
systemctl is-enabled crond  -centos7
chkconfig --list crond      -centos6

#查看服务状态
systemctl status crond  centos7
service crond status    centos6

#启动服务

systemctl start crond   centos7
service crond start     centos6

常用参数

参数 说明
-e 编辑任务列表
-r 删除目前的任务列表
-l 列出目前的任务列表

无限重启修复:/etc/crontab文件内填写reboot后

centos7:
1.按e键之后找到Linux16这行跳到行末net.inframes=0后面加rd.break
不要按回车,回车是换行。按ctrl+x(底下有提示,)
2.进入紧急救援模式,df可查看找到真正的根 (我这里是/sysroot)
3.cd /sysrootcd/
4.vi /sysroot/etc/crontab 修改 (wq!不让写入,输入mount命令可查看是否ro权限)
5.重新挂载更改rw权限
mount -o remount,rw /sysroot
6.vi /sysroot/etc/crontab 修改 (可以存盘退出了)

crontab 命令

[root@localhost ~]# crontab --help
crontab: invalid option -- '-'
crontab: usage error: unrecognized option
Usage:
 crontab [options] file
 crontab [options]
 crontab -n [hostname]

Options:
 -u <user>  define user              #定义用户,仅root可进行,指定用户管理cron任务
 -e         edit user's crontab      #编辑任务
 -l         list user's crontab      #显示用户的任务计划
 -r         delete user's crontab    #删除用户的任务计划
 -i         prompt before deleting   #同-r 同使用,以交互模式让用户有选择地移除指定任务
 -n <host>  set host in cluster to run users' crontabs #设置机器加护任务
 -c         get host in cluster to run users' crontabs #获取机器
 -s         selinux context
 -x <mask>  enable debugging
 ps:如果在cron任务有使用% 需要进行转义

例子

1每隔一分钟执行一次脚本 /opt/bin/test-cron.sh

*/1 * * * * root  /opt/bin/test-cron.sh

2 在 12:01 a.m 运行,即每天凌晨过一分钟。这是一个恰当的进行备份的时间,因为此时系统负载不大。

1 0 * * * /root/bin/backup.sh

3 每个工作日(Mon – Fri) 11:59 p.m 都进行备份作业

59 11 * * 1,2,3,4,5 /root/bin/backup.sh
59 11 * * 1-5 /root/bin/backup.sh

注意事项

1.后面的文件要注意路径,用pwd进行查看一下