1、at (一次性任务)
前提:服务必须启动
[root@y_zilong ~]#systemctl status atd.service
● atd.service - Job spooling tools
Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2021-04-19 08:52:00 CST; 12h ago
Main PID: 911 (atd)
CGroup: /system.slice/atd.service
└─911 /usr/sbin/atd -f
Apr 19 08:52:00 y_zilong.example.com systemd[1]: Started Job spooling tools.
Apr 19 08:52:00 y_zilong.example.com systemd[1]: Starting Job spooling tools...
[root@y_zilong ~]#
注意:
at创建计划任务,精确到分钟
任务的执行结果,会以邮件方式通知相关用户
1.1、创建一个任务
例1:在2021年4月19日的21:30执行一行命令:rm -f /tmp/f1
[root@y_zilong ~]#at 21:30 2021-04-19
at> rm -f /tmp/f1
at> <EOT> #ctrl+d 结束
job 6 at Mon Apr 19 21:30:00 2021
[root@y_zilong ~]#
例2:从当前时间算起,1分钟后执行
[root@y_zilong ~]#at now+1min
at> echo hello >> /tmp/tt
at> <EOT>
job 8 at Mon Apr 19 21:06:00 2021
[root@y_zilong ~]#cat /tmp/tt
hello
[root@y_zilong ~]#
例3:3天后的,下午5点执行命令
[root@y_zilong ~]#at 5pm+3days
at> echo hello >> /tmp/tt
at> <EOT>
job 9 at Thu Apr 22 17:00:00 2021
[root@y_zilong ~]#
1.2、查看任务
at任务存放位置 /var/spool/at/
时间一到,就调用这个目录下的文件执行任务,一旦完成,就删除
[root@y_zilong ~]#ls /var/spool/at/
a00006019bb12a a00009019bc0fc .SEQ spool/
atq #查看任务队列
at -l #列出指定队列中等待运行的作业,相当于atq
[root@y_zilong ~]#atq
6 Mon Apr 19 21:30:00 2021 a root
9 Thu Apr 22 17:00:00 2021 a root
[root@y_zilong ~]#at -l
6 Mon Apr 19 21:30:00 2021 a root
9 Thu Apr 22 17:00:00 2021 a root
[root@y_zilong ~]#
at -c JOBID(作业id) #查看具体作业任务
[root@y_zilong ~]#at -c 6
#!/bin/sh
# atrun uid=0 gid=0
rm -f /tmp/f1
marcinDELIMITER53bea059
[root@y_zilong ~]#at -c 9
#!/bin/sh
# atrun uid=0 gid=0
echo hello >> /tmp/tt
1.3、删除任务
atrm JOBID #删除指定任务
at -d JOBID #删除指定任务,相当于atrm
[root@y_zilong ~]#atq
6 Mon Apr 19 21:30:00 2021 a root
9 Thu Apr 22 17:00:00 2021 a root
[root@y_zilong ~]#atrm 6
[root@y_zilong ~]#atq
9 Thu Apr 22 17:00:00 2021 a root
[root@y_zilong ~]#at -d 9
[root@y_zilong ~]#atq
[root@y_zilong ~]#
[root@y_zilong ~]#
2、cron (周期性任务)
cron任务有两种:
系统cron任务,由系统来维护作业
/etc/crontab
用户cron任务
/var/spool/cron/
[root@y_zilong ~]#cat /etc/crontab
SHELL=/bin/bash #默认的shell类型
PATH=/sbin:/bin:/usr/sbin:/usr/bin #默认的PATH变量值,可修改为其他路径
MAILTO=root #默认标准输出和错误发邮件给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) #星期几
# | | | | |
# * * * * * user-name command to be executed
[root@y_zilong ~]#
systemctl status crond.service
#启动服务
注意:cron计划任务也是精确到分钟
2.1、创建一个任务
crontab -e
分钟 小时 日期 月 星期几 commond
例1:每月 1号和15号,晚上8点到19点间,每隔5分钟,执行一次date命令
[root@y_zilong ~]#crontab -e
no crontab for root - using an empty one
*/5 20-22 1,15 * * date
[root@y_zilong ~]#crontab -e
no crontab for root - using an empty one
crontab: installing new crontab
[root@y_zilong ~]#crontab -l
*/5 20-22 1,15 * * date
[root@y_zilong ~]#
例2:以root用户身份,为student用户创建一个任务计划
-u #指定用户
[root@y_zilong ~]#crontab -e -u student
[root@y_zilong ~]#cat /var/spool/cron/student
*/5 * * * * echo hello
[root@y_zilong ~]#
注意:
每个普通用户都可以创建自己的计划任务,只有root才可以为其他用户创建计划任务
星期天才是一周的第一天,0代表星期天,1代表星期一
日月和星期同时出现,代表或,当任何一个字段与当前时间匹配时,都运行该命令
2.2、查看计划任务
在/var/spool/cron/这个目录下,以任务用户命名的文件
#cron执行完任务,不会自动删除文件
[root@y_zilong ~]#ls /var/spool/cron/
root student
[root@y_zilong ~]#
列出等待中的任务
crontab -l
[root@y_zilong ~]#crontab -l
*/5 20-22 1,15 * * date
[root@y_zilong ~]#
2.3、删除任务
crontab -r #清空所有任务
crontab -ri #交互删除任务
删除任务,同样以crontab -e 进行编辑删除对应的行
crontab -r -u student #删除用户创建的任务
[root@y_zilong ~]#crontab -r -u student
[root@y_zilong ~]#cat /var/spool/cron/student
cat: /var/spool/cron/student: No such file or directory
[root@y_zilong ~]#
2.4、日志
tail -f /var/log/cron #检查cron日志记录
[root@y_zilong ~]#tail -f /var/log/cron
Apr 19 21:55:01 y_zilong CROND[11864]: (student) CMD (echo hello)
Apr 19 22:00:01 y_zilong CROND[11970]: (student) CMD (echo hello)
Apr 19 22:00:01 y_zilong CROND[11971]: (root) CMD (/usr/lib64/sa/sa1 1 1)
Apr 19 22:01:01 y_zilong CROND[12003]: (root) CMD (run-parts /etc/cron.hourly)
Apr 19 22:01:01 y_zilong run-parts(/etc/cron.hourly)[12003]: starting 0anacron
Apr 19 22:01:01 y_zilong run-parts(/etc/cron.hourly)[12016]: finished 0anacron
Apr 19 22:05:01 y_zilong CROND[12068]: (student) CMD (echo hello)
Apr 19 22:05:30 y_zilong crontab[12093]: (root) LIST (root)
Apr 19 22:09:12 y_zilong crontab[12124]: (root) DELETE (student)
Apr 19 22:10:01 y_zilong CROND[12148]: (root) CMD (/usr/lib64/sa/sa1 1 1)
2.5、限制
黑名单:/etc/cron.deny
#默认存在,只要写在这个文件中的用户,无法编写任务计划,一个用户一行
[root@y_zilong ~]#vi /etc/cron.deny
[root@y_zilong ~]#cat /etc/cron.deny
student
[root@y_zilong ~]#crontab -e -u student
no crontab for student - using an empty one
crontab: installing new crontab
"/tmp/crontab.QgOkNW":1: bad command
errors in crontab file, can't install.
#命令错误,无法安装
白名单:/etc/cron.allow
#默认不存在,只要写到这个文件的用户才可以创建计划任务,其它用户不可创建
3、管理临时空间
系统运行中,会产生大量的临时文件,需要定时清理
Centos 6使用/etc/cron.daily/tmpwatch定时清理临时文件
Centos 7使用systemd-tmpfiles-setup服务实现
/tmp目录是受systemd-tmpfiles-setup这个服务控制管理的,它提供了一个命令行工具systemd-tmpfiles,当系统启动时,systemd-tmpfiles-setup服务会先去读取它的配置文件,根据配置文件分别去删除和创建/tmp目录下临时文件
systemd-tmpfiles-setup服务的配置文件
/usr/lib/tmpfiles.d/*.conf #安装软件时产生的
[root@y_zilong ~]#ls /usr/lib/tmpfiles.d/
/run/tmpfiles.d/*.conf #和进程相关的
[root@y_zilong ~]#ls /run/tmpfiles.d/
/etc/tmpfiles.d/*.conf #这里才是我们需要配置的地方,优先级最高,这里的配置会优先生效
[root@y_zilong ~]#ls /etc/tmpfiles.d/
3.1、三个目录的优先级
/etc/tmpfiles.d/ > /run/tmpfiles.d/ > /usr/lib/tmpfiles.d/
自定义
默认情况下,/etc/tmpfiles.d/下面的配置为空,拷贝一个实例过来
cp /usr/lib/tmpfiles.d/tmp.conf /etc/tmpfiles.d/
vim /etc/tmpfiles.d/tmp.conf
d /tmp/test 1777 root root 10d
#如果/tmp/test这个目录不存,就创建这个目录,权限是777,如果存在,就删除/tmp/test目录下。10天以上未使用的文件
d /var/tmp/test 1777 root root 30d
#自动删除/var/tmp/test 目录下30天以上未使用的文件
[root@y_zilong ~]#cp /usr/lib/tmpfiles.d/tmp.conf /etc/tmpfiles.d/
[root@y_zilong ~]#cd /etc/tmpfiles.d/
[root@y_zilong tmpfiles.d]#ls
tmp.conf
[root@y_zilong tmpfiles.d]#cat tmp.conf
d /tmp/test 1777 root root 10d
d /var/tmp/test 1777 root root 30d
[root@y_zilong tmpfiles.d]#
也可以在/etc/tmpfiles.d/下面创建一个配置文件,执行单次任务
例如:删除/tmp/doc目录下180天以上都未使用过的文件
[root@y_zilong ~]#touch /etc/tmpfiles.d/doc.conf
[root@y_zilong ~]#vi /etc/tmpfiles.d/doc.conf
[root@y_zilong ~]#cat /etc/tmpfiles.d/doc.conf
d /tmp/doc 0700 root root 180d
[root@y_zilong ~]#
修改配置文件后,怎么执行?
systemd-tmpfiles --clean
[root@y_zilong ~]#systemd-tmpfiles --clean
[root@y_zilong ~]#
4、PATH变量
方法1,在计划任务配置中指定PATH
[root@y_zilong ~]#which $PATH
/usr/bin/which: no bin in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root)
[root@y_zilong ~]#crontab -l
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
* * * * * useradd hehe;echo $PATH
[root@y_zilong ~]#cat /etc/passwd
hehe:x:1001:1001::/home/hehe:/bin/bash
[root@y_zilong ~]#
方法2,在脚本中指定PATH变量
[root@y_zilong ~]#cat /data/test.sh
#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
useradd hehehe
echo $PATH
[root@y_zilong ~]#crontab -l
* * * * * /data/test.sh
[root@y_zilong ~]#
5、在crontab中%的用法
cron任务中不建议使用%,它有特殊用途,它表示转行的特殊意义,且第一个%后的所有字符串会被当作命令的标准输入,如果在命令中要使用%,则需要用\转义
30 2 * * * /bin/cp -a /etc/ /data/etc `date+ \%F`
30 2 * * * /bin/cp -a /etc/ /data/etc `date+'%F'` 有问题
6、如何在秒级别运行任务?
sleep NUMBER[SUFFIX]...
SUFFIX:
s:秒,默认
m:分
h:小时
d:天
用sleep写在脚本里,再用cron计划任务
[root@y_zilong ~]#for min in 0 1 2;do echo "hi";sleep 5; done
hi
hi
hi
[root@y_zilong ~]#