linux系统定时任务

时间:2024-11-10 16:05:21

linux系统定时任务与延迟任务


linux系统定时任务

  • linux系统定时任务与延迟任务
  • 一、用户级的定时任务(永久)
  • 二、用户级crontab的执行限制(黑白名单)
  • 三、处理任务输出
  • 四、系统级cron的设定
  • 五、利用cron优化临时文件存储


一、用户级的定时任务(永久)

保证crond这个服务是开启的(默认情况下是开的)

rhel6

[root@trade ~]# service crond status
crond (pid  21661) is running...

rhel7后

systemctl status crond.service

写法:

man 5 crontab

0和7都表示周天
分钟 小时 天 月 周

在这里插入图片描述在这里插入图片描述


-u指定用户,-e编辑
回车会就可以直接编辑了

[root@trade ~]# crontab -u root -e

在这里插入图片描述


每分钟

* * * * * rm -fr /root/test1/*

用户是你用什么用户写的crontab任务

wq保存后,保存到/var/spool/cron/用户

[root@trade ~]# cat /var/spool/cron/root 
* * * * * rm -fr /root/test1/*

查看定时任务

[root@trade ~]# crontab -u root -l
* * * * * rm -fr /root/test1/*
[root@trade ~]# touch /root/test1/yan{1..3}

在这里插入图片描述在这里插入图片描述


撤销掉用户的所有定时任务

[root@trade ~]# crontab -u root -r
[root@trade ~]# crontab -u root -l
no crontab for root

删掉的是这个文件

[root@trade ~]# ls /var/spool/cron/
[root@trade ~]# 

每隔2min(分钟)

*/2 * * * * rm -fr /root/test1/*

早上9点到下午5点(小时)

*/2 09-17 * * * rm -fr /root/test1/*

每月1号到5号(天)

*/2 09-17 1,5 * * rm -fr /root/test1/* 

只有4月(月)

*/2 09-17 1,5 4 * rm -fr /root/test1/* 

只有周一(星期)

4月的1号和5号和4月的每一个周一早上09点到下午5点每隔2min执行一次

*/2 09-17 1,5 4 1 rm -fr /root/test1/*  

[root@trade ~]# crontab -u yan -e
[root@trade ~]# ls /var/spool/cron/
root  yan

[root@trade ~]# crontab -u root -e
crontab: installing new crontab
[root@trade ~]# crontab -u root -l
* * * * * touch /root/test1/yan{1..3}
[root@trade ~]# service crond stop
Stopping crond:                                            [  OK  ]

在这里插入图片描述


[root@trade ~]# service crond start
Starting crond:                                            [  OK  ]

在这里插入图片描述

每min创建一次,当有了就不会创建,这个是上min创建的

在这里插入图片描述


二、用户级crontab的执行限制(黑白名单)

黑白名单不会影响超级用户和系统级crontab

黑白名单其实和at是一样的

默认情况下所有用户都可以使用crontab

[root@trade ~]# su - oracle
[oracle@trade ~]$ crontab -e
[root@trade ~]# su - yan   
[yan@trade ~]$ crontab -e

黑名单

[root@trade ~]# vim /etc/cron.deny 
[root@trade ~]# cat /etc/cron.deny 
oracle
[root@trade ~]# su - oracle
[oracle@trade ~]$ crontab -e
You (oracle) are not allowed to use this program (crontab)
See crontab(1) for more information

但是用超级用户下用oracle执行crontab可以写

[root@trade ~]# crontab -u oracle -e
[root@trade ~]# crontab -u oracle -l
* * * * * touch /home/oracle/yan{1..3}

在这里插入图片描述


默认情况下是没有白名单

[root@trade ~]# ls -l /etc/cron.allow
ls: cannot access /etc/cron.allow: No such file or directory

白名单

有白名单,黑名单就不生效
只有root和白名单的用户允许,其它都不允许

[root@trade ~]# su - yan
[yan@trade ~]$ crontab -e
crontab: installing new crontab
[yan@trade ~]$ logout
[root@trade ~]# su - oracle
[oracle@trade ~]$ crontab -e
crontab: installing new crontab
[oracle@trade ~]$ logout

[root@trade ~]# touch /etc/cron.allow
[root@trade ~]# echo yan > /etc/cron.allow
[oracle@trade ~]$ cat /etc/cron.allow 
yan

[root@trade ~]# su - yan
[yan@trade ~]$ crontab -e
crontab: installing new crontab
[yan@trade ~]$ logout

[root@trade ~]# su - oracle
[oracle@trade ~]$ crontab -e
You (oracle) are not allowed to use this program (crontab)
See crontab(1) for more information

三、处理任务输出

at命令和crontab执行程序,有输出的程序,输出会以邮件的形式发送邮件的发起者
比如root发起at命令,在系统会生成以root身份给root发邮件


安装邮件服务
postfix发邮件 mailx查看邮件

开启postfix服务后就可以用mail查看邮件

dnf install postfix mailx -y
systemctl enable --now postfix

没有邮件

[root@server2 ~]# mail -uroot
No mail for root

用mail给root发邮件
Subject标题
正文
正文出现.
然后回车,邮件就发送了

[root@server2 ~]# mail root
Subject: test
adafa
fsfes
faf
。
.
EOT

mail -u用户 查看用户的文件,查看的时候输入数字,这个邮件内容显示出来

在这里插入图片描述

邮件其它指令help
delete删掉邮件

在这里插入图片描述

& delete 1
& quit
[root@server2 ~]# mail -uroot
No mail for root

快速删掉邮件,把邮件文件清空掉
邮件文件在/var/spool/mail清空那个用户写那个用户

[root@server2 ~]# > /var/spool/mail/root 
[root@server2 ~]# crontab -u root -e
* * * * * /bin/date

默认情况会发送给root
在这里插入图片描述

这个文件写了邮件发送给谁

[root@server2 ~]# vim /etc/crontab 

在这里插入图片描述

如果不想给任何人发邮件,设定为空
这个文件是系统文件,重启服务不行systemctl restart

在这里插入图片描述

方法二
立即生效

[root@server2 ~]# crontab -u root -e
MAILTO=''
* * * * * /bin/date
[root@server2 ~]# mail
No mail for root

把MAILTO删掉,配置文件还原
这样它还是会发送文件

彻底取消邮件发送功能

[root@server2 ~]# vim /etc/sysconfig/crond 

-m off 邮件功能关闭
在这里插入图片描述

[root@server2 ~]# systemctl restart  

执行了,mail 没有邮件

[root@server2 ~]# cat /var/log/cron
Aug 30 21:58:01 server2 CROND[3986]: (oracle) CMD (/bin/date)

[root@server2 ~]# mail
No mail for root

更多参数

[root@server2 ~]# man crond

在这里插入图片描述

处理有输出的走向,但是无论如何处理它的输出都会在/var/log/cron产生
在这里插入图片描述

不想产生,把其输出屏蔽掉,把输出重定向

[root@server2 ~]# crontab -u oracle -e
* * * * * /bin/date &> /dev/null

屏蔽邮件,但是屏蔽邮件后会有日志,彻底把指令输出屏蔽,编写crontab的时候,在执行指令最后加上输出重定向,让它执行指令的时候不要产生输出,彻底杜绝输出的出来


四、系统级cron的设定

系统级定时任务只有超级用户可以做

[root@trade cron.d]# ls -ld /etc/cron.d
drwxr-xr-x. 2 root root 4096 Aug 29 16:19 /etc/cron.d

一般用来对临时文件管理

每天执行的动作,每小时执行的动作,每月执行的动作,每周执行的动作
在这里插入图片描述
写个脚本,只需要将该脚本移到上面的目录,就会每天、小时、月、周执行一遍脚本

我把写的脚本移动/etc/下,那么我的脚本每小时就能执行一次

[root@trade test]# vim test.sh
[root@trade test]# cat test.sh 
#!/bin/bash
rm -fr /root/test1/*
[root@trade test]# cp test.sh /etc/cron.hourly/
[root@trade test]# chmod +x /etc/cron.hourly/test.sh

如果想自己定义时间
在这里插入图片描述
每次执行都是整点过1分,原因
前面写的crontab都是整点过1分,比如写的*****,12.00.01才执行

[root@trade test]# cd /etc/cron.d       
[root@trade cron.d]# cat 0hourly 
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
01 * * * * root run-parts /etc/cron.hourly

自己写一个
每分钟以超级用户的身份删掉/root/test1底下的内容

和用户级crontab相比配置文件多了用户身份

[root@trade cron.d]# vim yan
[root@trade cron.d]# cat yan
* * * * * root rm -fr /root/test1/*

[root@trade oracle]# touch /root/test1/yan{1..3}

在这里插入图片描述
执行成功

在这里插入图片描述


五、利用cron优化临时文件存储

程序在使用临时文件,把临时文件处理掉,程序会出问题
(比如,你在餐馆吃饭,碗筷类似临时文件,你没吃完,就不给用碗筷)
临时文件有生命周期,在系统存在x时间后才能被清理
临时目录/tmp,这里面的文件不会随便消失,存在10天以上会被清理掉
在这里插入图片描述因为系统中对临时管理文件是有策略
/lib//目录中全是临时文件的配置
里面有
第一列类型 第二列名称 权限 所有人 所有组 生命周期,能看见/tmp里面的存在的东西超过10天会被清理掉

在这里插入图片描述


将上个实验的环境删掉

[root@trade tmp]# cd /etc/cron.d/
[root@trade cron.d]# rm -fr yan 

自己写一个
类型 生成文件名称 权限 所有人 所有组 临时文件生命周期
自己写必须.conf结尾
5s后这个临时目录里面的东西才能清理

[root@server2 ]# vim /lib//
[root@server2 ]# cat  
d /mnt/yan 1777 root root 5s

建立用create 清理用clean
systemd-tmpfiles必须是超级用户才能使用

root@server2 ]# systemd-tmpfiles --create /lib// 
[root@server2 mnt]# watch -n1 ls -l /mnt/yan
[root@server2 ]# touch /mnt/yan/yan{1..3}

在这里插入图片描述

[root@server2 ]# touch /mnt/yan/yan{3..5}

在这里插入图片描述

[root@server2 ]# systemd-tmpfiles --clean /lib// 

在这里插入图片描述

没有过5s

[root@server2 ]# touch /mnt/yan/yan{3..5}
[root@server2 ]# systemd-tmpfiles --clean /lib// 

在这里插入图片描述

5s以后

[root@server2 ]# systemd-tmpfiles --clean /lib// 

在这里插入图片描述


每s/H自己去清理下系统的临时文件(符合生命周期完成的临时文件),用rm可能对系统造成损害,所以使用临时文件清理指令更温和点
systemd-tmpfiles必须是超级用户才能使用

[root@server2 ]# vim /etc//yan
[root@server2 ]# cat /etc//yan 
* * * * * root system-tmpfiles --clean /lib//*.conf
01 * * * *  
[root@server2 ]# touch /mnt/yan/yan{3..5}

在这里插入图片描述

1min后

在这里插入图片描述


直接写crontab也行(效果一样)

[root@server2 ]# rm -fr yan 
[root@server2 ]# ls
0hourly

每min清理掉临时文件(符合生命周期完成的临时文件)

[root@server2 ~]# crontab -u root -e 
* * * * *  systemd-tmpfiles --clean /lib//*.conf

END