欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

linux系統(tǒng)定時(shí)任務(wù)與延遲任務(wù)詳解

 更新時(shí)間:2025年08月04日 10:13:46   作者:閆渭丘  
本文簡要介紹了Linux系統(tǒng)中定時(shí)任務(wù)與延遲任務(wù)的設(shè)置方法,涵蓋at命令(單次任務(wù))、crontab(用戶級永久任務(wù))、系統(tǒng)級cron(全局任務(wù))及systemd-tmpfiles(臨時(shí)文件管理),并涉及權(quán)限控制、郵件通知處理和任務(wù)執(zhí)行策略

一、延遲任務(wù)(一次性)

比如:今天設(shè)置了延遲任務(wù),今天下午清理文件,延遲任務(wù)執(zhí)行了,明天就不會(huì)執(zhí)行,除非再設(shè)置一次

1.1 環(huán)境

[root@trade test1]# touch yan{1..3} 
[root@trade test1]# ls -l
total 0
-rw-r--r--. 1 root root 0 Aug 29 10:50 yan1
-rw-r--r--. 1 root root 0 Aug 29 10:50 yan2
-rw-r--r--. 1 root root 0 Aug 29 10:50 yan3
[root@trade test1]# watch -n 1 ls -l /root/test1

監(jiān)控

1.2 創(chuàng)建延遲任務(wù)

開啟新窗口,在x時(shí)間清空掉/root/test1的文件

ctrl+d任務(wù)發(fā)起

[root@trade ~]# at 11:00
at> rm -fr /root/test1/*

ctrl+d生效后

at> <EOT>
job 1 at 2022-08-29 11:00

11:00:00準(zhǔn)時(shí)清除掉該目錄下的文件

多個(gè)任務(wù),一行一行寫,寫完ctrl +d

或者這樣寫

單位也可以是1day

[root@trade ~]# at now+1min
at> rm -fr /root/test1/*
at> <EOT>
job 6 at 2022-08-29 13:21

1.3 查看任務(wù)列表

[root@trade ~]# at 11:05
at> touch /root/test1/ywq
at> <EOT>
job 3 at 2022-08-29 11:05
[root@trade ~]# at -l
3	2022-08-29 11:05 a root

1.4 查看任務(wù)內(nèi)容

很長,看最后一行,就知道任務(wù)內(nèi)容

[root@trade ~]# at -c 3

at -l查到任務(wù)05分執(zhí)行,20分時(shí)任務(wù)執(zhí)行完成了

1.5取消任務(wù)內(nèi)容

[root@trade ~]# at -l
5	2022-08-29 13:30 a root

新版本這樣取消

[root@trade ~]# at -r 5

老版本這樣取消

[root@trade ~]# atrm 5
[root@trade ~]# at -l
[root@trade ~]# 

二、at命令黑白名單

默認(rèn)任意用戶都可以使用at命令

這樣首先安全性不高,其次任意用戶發(fā)起at命令會(huì)使得系統(tǒng)負(fù)載變高

系統(tǒng)中默認(rèn)存在黑名單

[root@trade ~]# ls -l /etc/at.deny
-rw-r--r--. 1 root root 1 Jan 20  2012 /etc/at.deny
[root@trade ~]# ls -l /etc/at.allow
ls: cannot access /etc/at.allow: No such file or directory

寫法

[root@trade ~]# man 5 at.deny 

有at.allow的時(shí)候,at.deny不生效

黑名單

[root@trade ~]# su - yan
[yan@trade ~]$ at 13:40
at> ^C[yan@trade ~]$ logout

[root@trade ~]# vim /etc/at.deny 
[root@trade ~]# cat /etc/at.deny 
yan

[root@trade ~]# su - yan
[yan@trade ~]$ at 13:40
You do not have permission to use at.
[yan@trade ~]$ logout
[root@trade ~]# vim /etc/at.deny 
[root@trade ~]# cat /etc/at.deny 
[root@trade ~]# su - yan
[yan@trade ~]$ at 13:40
at> ^C

白名單

有白名單,黑名單不生效

除了白名單的用戶和超級用戶可以使用at命令以外,所有用戶都不能使用at命令

[root@trade ~]# touch /etc/at.allow
[root@trade ~]# su - oracle
[oracle@trade ~]$ at now+1min
You do not have permission to use at.
[oracle@trade ~]$ logout

[root@trade ~]# su - yan
[yan@trade ~]$ at now+1min
You do not have permission to use at.
[yan@trade ~]$ logout
[root@trade ~]# vim /etc/at.allow 
[root@trade ~]# cat /etc/at.allow 
oracle

[root@trade ~]# su - oracle
[oracle@trade ~]$ at now+1min
at> ^C[oracle@trade ~]$ logout

[root@trade ~]# su - yan
[yan@trade ~]$ at now+1min
You do not have permission to use at.
[yan@trade ~]$ logout

三、用戶級的定時(shí)任務(wù)(永久)

保證crond這個(gè)服務(wù)是開啟的(默認(rèn)情況下是開的)

rhel6

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

rhel7后

systemctl status crond.service

寫法:

man 5 crontab

0和7都表示周天

分鐘 小時(shí) 天 月 周

-u指定用戶,-e編輯

回車會(huì)就可以直接編輯了

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

每分鐘

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

用戶是你用什么用戶寫的crontab任務(wù)

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

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

查看定時(shí)任務(wù)

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

撤銷掉用戶的所有定時(shí)任務(wù)

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

刪掉的是這個(gè)文件

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

每隔2min(分鐘)

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

早上9點(diǎn)到下午5點(diǎn)(小時(shí))

*/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月的每一個(gè)周一早上09點(diǎn)到下午5點(diǎn)每隔2min執(zhí)行一次

*/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創(chuàng)建一次,當(dāng)有了就不會(huì)創(chuàng)建,這個(gè)是上min創(chuàng)建的

四、用戶級crontab的執(zhí)行限制(黑白名單)

黑白名單不會(huì)影響超級用戶和系統(tǒng)級crontab

黑白名單其實(shí)和at是一樣的

默認(rèn)情況下所有用戶都可以使用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執(zhí)行crontab可以寫

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

默認(rèn)情況下是沒有白名單

[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

五、處理任務(wù)輸出

at命令和crontab執(zhí)行程序,有輸出的程序,輸出會(huì)以郵件的形式發(fā)送郵件的發(fā)起者

比如root發(fā)起at命令,在系統(tǒng)會(huì)生成以root身份給root發(fā)郵件

安裝郵件服務(wù)

postfix發(fā)郵件 mailx查看郵件

開啟postfix服務(wù)后就可以用mail查看郵件

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

沒有郵件

[root@server2 ~]# mail -uroot
No mail for root
  • 用mail給root發(fā)郵件
  • Subject標(biāo)題
  • 正文
  • 正文出現(xiàn).
  • 然后回車,郵件就發(fā)送了
[root@server2 ~]# mail root
Subject: test
adafa
fsfes
faf
。
.
EOT

mail -u用戶 查看用戶的文件,查看的時(shí)候輸入數(shù)字,這個(gè)郵件內(nèi)容顯示出來

  • 郵件其它指令help
  • delete刪掉郵件

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

快速刪掉郵件,把郵件文件清空掉

郵件文件在/var/spool/mail清空那個(gè)用戶寫那個(gè)用戶

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

默認(rèn)情況會(huì)發(fā)送給root

這個(gè)文件寫了郵件發(fā)送給誰

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

如果不想給任何人發(fā)郵件,設(shè)定為空

這個(gè)文件是系統(tǒng)文件,重啟服務(wù)不行systemctl restart crond.service

方法二

立即生效

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

把MAILTO刪掉,配置文件還原

這樣它還是會(huì)發(fā)送文件

徹底取消郵件發(fā)送功能

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

-m off 郵件功能關(guān)閉

[root@server2 ~]# systemctl restart crond.service 

執(zhí)行了,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

更多參數(shù)

[root@server2 ~]# man crond

處理有輸出的走向,但是無論如何處理它的輸出都會(huì)在/var/log/cron產(chǎn)生

不想產(chǎn)生,把其輸出屏蔽掉,把輸出重定向

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

屏蔽郵件,但是屏蔽郵件后會(huì)有日志,徹底把指令輸出屏蔽,編寫crontab的時(shí)候,在執(zhí)行指令最后加上輸出重定向,讓它執(zhí)行指令的時(shí)候不要產(chǎn)生輸出,徹底杜絕輸出的出來

六、系統(tǒng)級cron的設(shè)定

系統(tǒng)級定時(shí)任務(wù)只有超級用戶可以做

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

一般用來對臨時(shí)文件管理

每天執(zhí)行的動(dòng)作,每小時(shí)執(zhí)行的動(dòng)作,每月執(zhí)行的動(dòng)作,每周執(zhí)行的動(dòng)作

寫個(gè)腳本,只需要將該腳本移到上面的目錄,就會(huì)每天、小時(shí)、月、周執(zhí)行一遍腳本

我把寫的腳本移動(dòng)/etc/cron.hourly下,那么我的腳本每小時(shí)就能執(zhí)行一次

[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

如果想自己定義時(shí)間

每次執(zhí)行都是整點(diǎn)過1分,原因

前面寫的crontab都是整點(diǎn)過1分,比如寫的*****,12.00.01才執(zhí)行

[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

自己寫一個(gè)

每分鐘以超級用戶的身份刪掉/root/test1底下的內(nèi)容

和用戶級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}

執(zhí)行成功

七、利用cron優(yōu)化臨時(shí)文件存儲(chǔ)

程序在使用臨時(shí)文件,把臨時(shí)文件處理掉,程序會(huì)出問題

(比如,你在餐館吃飯,碗筷類似臨時(shí)文件,你沒吃完,就不給用碗筷)

臨時(shí)文件有生命周期,在系統(tǒng)存在x時(shí)間后才能被清理

臨時(shí)目錄/tmp,這里面的文件不會(huì)隨便消失,存在10天以上會(huì)被清理掉

因?yàn)橄到y(tǒng)中對臨時(shí)管理文件是有策略

/lib/tmpfiles.d/目錄中全是臨時(shí)文件的配置

里面有tmp.conf

第一列類型 第二列名稱 權(quán)限 所有人 所有組 生命周期,能看見/tmp里面的存在的東西超過10天會(huì)被清理掉

將上個(gè)實(shí)驗(yàn)的環(huán)境刪掉

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

自己寫一個(gè)

類型 生成文件名稱 權(quán)限 所有人 所有組 臨時(shí)文件生命周期

自己寫必須.conf結(jié)尾

5s后這個(gè)臨時(shí)目錄里面的東西才能清理

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

建立用create 清理用clean

systemd-tmpfiles必須是超級用戶才能使用

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

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

[root@server2 tmpfiles.d]# systemd-tmpfiles --clean /lib/tmpfiles.d/yan.conf 

沒有過5s

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

5s以后

[root@server2 tmpfiles.d]# systemd-tmpfiles --clean /lib/tmpfiles.d/yan.conf 

每s/H自己去清理下系統(tǒng)的臨時(shí)文件(符合生命周期完成的臨時(shí)文件),用rm可能對系統(tǒng)造成損害,所以使用臨時(shí)文件清理指令更溫和點(diǎn)systemd-tmpfiles必須是超級用戶才能使用

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

1min后

直接寫crontab也行(效果一樣)

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

每min清理掉臨時(shí)文件(符合生命周期完成的臨時(shí)文件)

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

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論