at和cron(计划任务)

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 ~]#

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

y_zilong

一分钱的肯定

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值