linux系統(tǒng)定時任務與延遲任務詳解
一、延遲任務(一次性)
比如:今天設置了延遲任務,今天下午清理文件,延遲任務執(zhí)行了,明天就不會執(zhí)行,除非再設置一次
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)建延遲任務
開啟新窗口,在x時間清空掉/root/test1的文件
ctrl+d任務發(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準時清除掉該目錄下的文件

多個任務,一行一行寫,寫完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 查看任務列表
[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 查看任務內容
很長,看最后一行,就知道任務內容
[root@trade ~]# at -c 3

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

1.5取消任務內容
[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命令黑白名單
默認任意用戶都可以使用at命令
這樣首先安全性不高,其次任意用戶發(fā)起at命令會使得系統(tǒng)負載變高
系統(tǒng)中默認存在黑名單
[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的時候,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
三、用戶級的定時任務(永久)
保證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執(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)建一次,當有了就不會創(chuàng)建,這個是上min創(chuàng)建的

四、用戶級crontab的執(zhí)行限制(黑白名單)
黑白名單不會影響超級用戶和系統(tǒng)級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執(zhí)行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執(zhí)行程序,有輸出的程序,輸出會以郵件的形式發(fā)送郵件的發(fā)起者
比如root發(fā)起at命令,在系統(tǒng)會生成以root身份給root發(fā)郵件
安裝郵件服務
postfix發(fā)郵件 mailx查看郵件
開啟postfix服務后就可以用mail查看郵件
dnf install postfix mailx -y systemctl enable --now postfix
沒有郵件
[root@server2 ~]# mail -uroot No mail for root
- 用mail給root發(fā)郵件
- Subject標題
- 正文
- 正文出現(xiàn).
- 然后回車,郵件就發(fā)送了
[root@server2 ~]# mail root Subject: test adafa fsfes faf 。 . EOT
mail -u用戶 查看用戶的文件,查看的時候輸入數(shù)字,這個郵件內容顯示出來

- 郵件其它指令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
默認情況會發(fā)送給root

這個文件寫了郵件發(fā)送給誰
[root@server2 ~]# vim /etc/crontab

如果不想給任何人發(fā)郵件,設定為空
這個文件是系統(tǒng)文件,重啟服務不行systemctl restart crond.service

方法二
立即生效
[root@server2 ~]# crontab -u root -e MAILTO='' * * * * * /bin/date
[root@server2 ~]# mail No mail for root
把MAILTO刪掉,配置文件還原
這樣它還是會發(fā)送文件
徹底取消郵件發(fā)送功能
[root@server2 ~]# vim /etc/sysconfig/crond
-m off 郵件功能關閉

[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

處理有輸出的走向,但是無論如何處理它的輸出都會在/var/log/cron產生

不想產生,把其輸出屏蔽掉,把輸出重定向
[root@server2 ~]# crontab -u oracle -e * * * * * /bin/date &> /dev/null
屏蔽郵件,但是屏蔽郵件后會有日志,徹底把指令輸出屏蔽,編寫crontab的時候,在執(zhí)行指令最后加上輸出重定向,讓它執(zhí)行指令的時候不要產生輸出,徹底杜絕輸出的出來
六、系統(tǒng)級cron的設定
系統(tǒng)級定時任務只有超級用戶可以做
[root@trade cron.d]# ls -ld /etc/cron.d drwxr-xr-x. 2 root root 4096 Aug 29 16:19 /etc/cron.d
一般用來對臨時文件管理
每天執(zhí)行的動作,每小時執(zhí)行的動作,每月執(zhí)行的動作,每周執(zhí)行的動作

寫個腳本,只需要將該腳本移到上面的目錄,就會每天、小時、月、周執(zhí)行一遍腳本
我把寫的腳本移動/etc/cron.hourly下,那么我的腳本每小時就能執(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
如果想自己定義時間

每次執(zhí)行都是整點過1分,原因
前面寫的crontab都是整點過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
自己寫一個
每分鐘以超級用戶的身份刪掉/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}

執(zhí)行成功

七、利用cron優(yōu)化臨時文件存儲
程序在使用臨時文件,把臨時文件處理掉,程序會出問題
(比如,你在餐館吃飯,碗筷類似臨時文件,你沒吃完,就不給用碗筷)
臨時文件有生命周期,在系統(tǒng)存在x時間后才能被清理
臨時目錄/tmp,這里面的文件不會隨便消失,存在10天以上會被清理掉

因為系統(tǒng)中對臨時管理文件是有策略
在/lib/tmpfiles.d/目錄中全是臨時文件的配置
里面有tmp.conf
第一列類型 第二列名稱 權限 所有人 所有組 生命周期,能看見/tmp里面的存在的東西超過10天會被清理掉

將上個實驗的環(huán)境刪掉
[root@trade tmp]# cd /etc/cron.d/ [root@trade cron.d]# rm -fr yan
自己寫一個
類型 生成文件名稱 權限 所有人 所有組 臨時文件生命周期
自己寫必須.conf結尾
5s后這個臨時目錄里面的東西才能清理
[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)的臨時文件(符合生命周期完成的臨時文件),用rm可能對系統(tǒng)造成損害,所以使用臨時文件清理指令更溫和點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清理掉臨時文件(符合生命周期完成的臨時文件)
[root@server2 ~]# crontab -u root -e * * * * * systemd-tmpfiles --clean /lib/tmpfiles.d/*.conf
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
用rsync對網(wǎng)站進行鏡像備份實現(xiàn)步驟
對系統(tǒng)管理員來說,平時的工作重心應該集中在維護系統(tǒng)正常運轉,能夠正常提供服務上,這里往往牽涉到一個數(shù)據(jù)備份的問題2009-03-03
linux 安裝pypy , virtualenv及使用方法
下面小編就為大家?guī)硪黄猯inux 安裝pypy , virtualenv及使用方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-12-12
Linux有限狀態(tài)機FSM的理解與實現(xiàn)
這篇文章主要幫助大家理解與實現(xiàn)Linux有限狀態(tài)機FSM,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06
CentOs 7.*中配置安裝phpMyAdmin的完整步驟記錄
phpMyAdmin是一個以PHP為基礎,以Web-Base方式架構在網(wǎng)站主機上的MySQL的資料庫管理工具。下面這篇文章主要給大家介紹了關于CentOs 7.*中配置安裝phpMyAdmin的相關資料,需要的朋友可以參考借鑒,下面來一起看看吧2018-07-07

