【講清楚,說明白!】計劃任務crontab及企業實戰應用

目錄:
(一)at計劃任務
(二)crontab計劃任務
(三)清理臨時文件


經驗豐富的系統運維工程師可以使得Linux系統在無需人工介入的情況下,在指定的時間段自動啓動或停止某些服務或命令,從而實現運維的自動化。儘管我們現在已經有了功能強大的腳本程序來執行一些批處理工作,但是如果仍然需要在每天凌晨兩點敲擊鍵盤回車鍵來執行這個腳本程序,這簡直太痛苦了。所以這就使得我們能掌握如何設置服務器的計劃任務服務的方法,並擁有把週期性,規律性的工作交給系統自動完成的技能顯得尤爲重要。
計劃任務分爲一次性計劃任務與週期性計劃任務。例如公司人事寫了一封放假郵件,計劃是在放假前最後一個工作日的上午10點發送全體員工,此時我們所需要的就是一次性計劃任務。再如數據庫管理員需要在每天凌晨2點對業務數據庫進行備份,此時我們所需要的就是通過週期性計劃任務解決這個需求。
(一)at計劃任務
(1.1)at是屬於一次性計劃任務,顧名思義,一次計劃任務只執行一次,一般用於滿足臨時的工作需求。我們可以使用at命令實現這種功能,只需要寫成“at 時間”的格式就可以了。如果想要查看已設置好但還未執行的一次性計劃任務,可以使用“at -l”命令;想要將其刪除,可以使用“atrm 任務序號”。在使用at命令來設置一次性計劃任務時,默認採用的是交互式方法。
(1.2)第一個使用“atq”或者“at -l”可以來查看當前系統中所有的計劃任務的列表情況。
# atq
# at -l
【講清楚,說明白!】計劃任務crontab及企業實戰應用
(1.3)對於at命令的用法,我們可以通過“man at”命令來查看。現在我們的需求是創建一個2019年10月27日的計劃任務(當前是26日),則我們可以查詢到符合自己使用習慣的日期表示方式,比如編輯在10月27日執行重啓httpd服務的計劃任務。需要注意的是,我們當前的時間是幾點,那麼創建的計劃任務所執行的時間,也就是我們所指定的那個日期與當前的時間點一致的時候執行。因爲我們是在2019年10月26日的20點01分創建的計劃任務,所以計劃任務執行的時間是2019年10月27日的20點01分。
# at 2019-10-27
at> systemctl restart httpd
【講清楚,說明白!】計劃任務crontab及企業實戰應用
【講清楚,說明白!】計劃任務crontab及企業實戰應用
(1.4)在創建指定時間的計劃任務時,我們也是可以指定具體的時間的,精確到時、分。
# at 22:00 2019-12-12---創建一個計劃任務,設定在2019年12月12日22:00分執行
# at 4pm 2019-12-12---創建一個計劃任務,設定在2019年12月12日下午4點執行
【講清楚,說明白!】計劃任務crontab及企業實戰應用
(1.5)如果我們想指定3周後下午4點執行重啓http服務的指令,則可以使用weeks參數;如果我們想要3天后的上午4點執行重啓http服務的指令,則可以使用days參數;如果我們想指定2個小時後執行重啓http服務的指令,則可以使用hours參數;如果我們想指定1小時後執行刪除/root/目錄下所有以rpm爲後綴的文件,則可以使用minutes參數。
# at 4pm + 3weeks
at> systemctl restart httpd
# at 4am + 3days
# at now + 2hours
# at now + 1minutes
at> rm -rf /root/*rpm
【講清楚,說明白!】計劃任務crontab及企業實戰應用
(1.6)如果我們想查詢具體的計劃任務的信息,可以使用兩種方式進行查看,第一種是使用“at -c”命令查詢(圖1-6和圖1-7);第二種是進入到/var/spool/at目錄下進行查看計劃任務的具體內容(圖1-8和圖1-9)。
# at -c 1
# cd /var/spool/at
【講清楚,說明白!】計劃任務crontab及企業實戰應用
【講清楚,說明白!】計劃任務crontab及企業實戰應用
【講清楚,說明白!】計劃任務crontab及企業實戰應用
【講清楚,說明白!】計劃任務crontab及企業實戰應用
(1.7)如果我們現在需要將多餘的計劃任務刪除,則可以使用“atrm”命令或者是“at -d”命令。如果我們希望批量刪除指定的計劃任務,則可以使用
# atrm 1---刪除第一個計劃任務
# at -d 2---刪除第二個計劃任務
# atrm {3..6}---刪除第3到第6個計劃任務
【講清楚,說明白!】計劃任務crontab及企業實戰應用
【講清楚,說明白!】計劃任務crontab及企業實戰應用
(1.8)默認情況下,系統中的普通用戶是可以執行計劃任務的。如果我們現在需求是希望不允許普通用戶執行計劃任務,則可以在/etc/at.deny文件中添加用戶,例如我們不允許tom用戶查詢和創建計劃任務,則可以參考圖1-12。此時tom用戶已經是不允許創建和查詢計劃任務了,而我們現在又希望tom用戶能夠創建個查詢計劃任務,我們可以使用兩種方式來實現,第一種是把tom用戶從/etc/at.deny文件中刪除;第二種方式是我們創建一個/etc/at.allow文件,並將tom用戶添加進去,由於系統默認當同一用戶同時存在/etc/at.allow和/etc/at.deny文件的時候,是/etc/at.allow文件中的設置生效(圖1-13)。
# vim /etc/at.deny
# vim /etc/at.allow
【講清楚,說明白!】計劃任務crontab及企業實戰應用
【講清楚,說明白!】計劃任務crontab及企業實戰應用


(二)crontab計劃任務
(2.1)如果我們希望Linux系統能夠週期性的、有規律的執行某些具體的任務,那麼Linux系統中默認啓用的crond服務簡直再合適不過了。創建、編輯計劃任務的命令爲“crontab -e”,查看當前計劃任務的命令爲“crontab -l”,刪除某條計劃任務的命令爲“crontab -r”。另外,如果您是以管理員的身份登錄的系統,還可以在crontab命令中加上-u參數來編輯他人的計劃任務。
(2.2)如果我們想查詢當前用戶在系統中存在的計劃任務可以使用“crontab -l”,如果我們想查詢tom用戶在系統中存在的計劃任務可以使用-u指明用戶。
# crontab -l---查詢當前用戶在系統中存在的計劃任務
# crontab -l -u tom---查詢tom用戶在系統中存在的計劃任務
【講清楚,說明白!】計劃任務crontab及企業實戰應用
(2.3)如果我們想要編輯當前用戶的計劃任務,則可以使用“crontab -e”,如果想要對指定的用戶編輯計劃任務,則應該再加上“-u”的選項(圖2-3)。我們在正式部署計劃任務之前,需要先默唸一下口訣“分、時、日、月、星期、命令”,這是使用crond服務設置任務的參數格式,需要注意的是,如果有些字段沒有設置,則需要使用星號(*)佔位。例如我們現在的需求是計劃在每天上午7點整執行一個腳本DeleteLock.sh,目標是查找到/mail分區下所有後綴爲“.lock”的文件,並將這些文件清除(圖2-4至圖2-6)。
# crontab -e -u tom---指定對tom用戶創建一個計劃任務
find /mail -type f -name "*.lock" -exec rm -rf {} \;---查找到/mail分區下所有後綴爲“.lock”的文件,並將這些文件清除
【講清楚,說明白!】計劃任務crontab及企業實戰應用
【講清楚,說明白!】計劃任務crontab及企業實戰應用
【講清楚,說明白!】計劃任務crontab及企業實戰應用
【講清楚,說明白!】計劃任務crontab及企業實戰應用
【講清楚,說明白!】計劃任務crontab及企業實戰應用
(2.4)如果我們的需求是星期一到星期五上午的7點整準時執行DeleteLock.sh腳本文件,則可以使用如下的三種方式來進行表示。
【講清楚,說明白!】計劃任務crontab及企業實戰應用
(2.5)如果我們現在的需求是在每天上午7點0分、5分、10分、30分執行一次DeleteLock.sh腳本文件,則可以使用如下的表示方式。
【講清楚,說明白!】計劃任務crontab及企業實戰應用
(2.6)現在我們的需求是1到3月份週一至週五每天上午7點整執行DeleteLock.sh腳本文件,即表示1到3月份所有的工作日都執行該命令(圖2-9)。或者我們的需求是1到3月份每個月的1到10號上午7點整我們都執行DeleteLock.sh腳本文件(圖2-10)。而當我們將以上兩種情況進行合併時,代表的並不是交集,而是並集,即表示1到3月份中每個月1至10號或者是所有的工作日都會執行DeleteLock.sh腳本文件(圖2-11)。
【講清楚,說明白!】計劃任務crontab及企業實戰應用
【講清楚,說明白!】計劃任務crontab及企業實戰應用
【講清楚,說明白!】計劃任務crontab及企業實戰應用
(2.7)如果我們想要查看所創建計劃任務則可以使用“crontab -l”命令進行查詢。
# crontab -l---查詢所有創建的計劃任務
【講清楚,說明白!】計劃任務crontab及企業實戰應用
(2.8)我們使用crontab創建的計劃任務都是保存在/var/spool/cron/目錄下的,我們進入到root文件中可以查看詳細的信息。
# cd /var/spool/cron/
【講清楚,說明白!】計劃任務crontab及企業實戰應用
【講清楚,說明白!】計劃任務crontab及企業實戰應用
(2.9)如果我們有一個很複雜的業務需求,在設計計劃任務的時候也沒有必要考慮的很複雜,我們可以把這個複雜的需求,拆分成多個簡單的條目來執行就可以了。比如我們現在的需求是每月的最後一天凌晨2點來執行DeleteLock.sh腳本文件。我們可以在crontab中創建四個條目,第一條設置1、3、5、7、8、10、12月每月31號執行DeleteLock.sh腳本;第二條設置4、6、9、11月每月30號執行DeleteLock.sh腳本;第三條創建一個腳本在每年的2月29日凌晨2點執行DeleteLock.sh腳本;第四條創建一個判斷腳本cc.sh,在每年的2月1日判斷當年是否是閏年,如果是閏年則使用swd或者awk命令將日期部分設置成29號,如果不是閏年則在cc.sh腳本中使用swd或者awk命令將29號替換成28號。
【講清楚,說明白!】計劃任務crontab及企業實戰應用
(2.10)在我們系統中也是存在着很多的系統任務的,我們進入到/etc/目錄下可以看到cron*開頭的所有文件,其中“/etc/cron.daily”代表的是每日執行的計劃任務,“/etc/cron.hourly”代表的是每小時執行的計劃任務,“/etc/cron.monthly”代表的是每月執行的計劃任務,“/etc/cron.weekly”代表的是每週執行的計劃任務。如果我們想要在特定的時間執行特定的計劃任務,則可以將編寫好的腳本放到對應的目錄當中。
【講清楚,說明白!】計劃任務crontab及企業實戰應用
(2.11)如果我們需要將創建的計劃任務刪除,則可以使用“crontab -r”將root用戶創建的所有計劃任務全部刪除。
# crontab -r
【講清楚,說明白!】計劃任務crontab及企業實戰應用
(2.12)在系統中默認是允許普通用戶創建計劃任務的,如果我們想要限制普通用戶創建計劃任務,則可以通過創建/etc/cron.deny文件,並填寫需要禁止的用戶名即可(圖2-18)。如果此時我們又允許tom用戶可以創建計劃任務,那麼我們可以通過兩種方式來實現,第一種是在/etc/cron.deny文件中將tom用戶刪除即可;第二種是我們再次創建一個/etc/cron.allow文件,並將tom用戶填寫到文件中,此時我們發現雖然/etc/cron.allow配置文件和/etc/cron.deny配置文件中都填寫了tom用戶,但是用戶同時存在時默認是以/etc/cron.allow配置文件中的信息生效(圖2-19)。
# vim /etc/cron.deny
【講清楚,說明白!】計劃任務crontab及企業實戰應用
【講清楚,說明白!】計劃任務crontab及企業實戰應用


(三)清理臨時文件
(3.1)在系統中很多時候會生成一些系統的臨時文件,例如在/tmp目錄下存在很多系統自動生成的文件。
# ls /tmp/
【講清楚,說明白!】計劃任務crontab及企業實戰應用
(3.2)例如我們現在的需求是將3天之前生成的系統文件全部清理掉,此時我們先將tmpwatch命令對應的軟件安裝起來,我們使用man tmpwatch命令可以查看tmpwatch命令相關參數的使用方法(圖3-3),我們將當前目錄中3天以前訪問的文件全部刪除掉(圖3-4),我們希望將當前目錄中3小時以上時間沒有訪問的文件全部刪除,則需要加上“-f”強制刪除的選項(圖3-5)。
# yum install tmpwatch -y
# tmpwatch -u 3d .---將當前目錄中3天以前訪問的文件全部刪除掉
# tmpwatch -u 3h . -f---將當前目錄中3小時以上時間沒有訪問的文件全部刪除
【講清楚,說明白!】計劃任務crontab及企業實戰應用
【講清楚,說明白!】計劃任務crontab及企業實戰應用
【講清楚,說明白!】計劃任務crontab及企業實戰應用
【講清楚,說明白!】計劃任務crontab及企業實戰應用
(3.3)當然我們的系統中還是有其他清除臨時文件的工具的,在RHEL7中新增加了一個服務用來管理臨時文件的。
# systemctl list-unit-files | grep systemd-tmpfi
【講清楚,說明白!】計劃任務crontab及企業實戰應用
(3.4)systemd-tmpfiles-setup.service這個服務可以定期清理一些文件,還可以定期創建一些必須的文件或目錄,systemd-tmpfiles要讀取自己的配置文件才能知道要清理哪些臨時文件,它需要讀取的配置文件主要是放在如下的目錄中的。
# ls /usr/lib/tmpfiles.d/---保存都是系統自動生成的文件供systemd-tmpfiles進行讀取,一般是不建議大家對其中的內容進行修改
# ls /run/tmpfiles.d/---保存都是系統守護進程產生的文件供systemd-tmpfiles進行讀取,我們一般也是不用去修改的
# ls /etc/tmpfiles.d/---主要存放的是用戶自己管理的一些配置文件供systemd-tmpfiles進行讀取,一般我們自定義的配置文件都是建議放在這個目錄中的
【講清楚,說明白!】計劃任務crontab及企業實戰應用
(3.5)我們在/etc/tmpfiles.d/目錄下創建一個aa.conf的配置文件,指定創建的目錄、目錄的默認權限、目錄的屬主屬組信息、超時清理文件的時間等。
# cd /etc/tmpfiles.d/
【講清楚,說明白!】計劃任務crontab及企業實戰應用
【講清楚,說明白!】計劃任務crontab及企業實戰應用
(3.6)接着我們執行systemd-tmpfiles命令時,系統便會自動創建/tmp/aa目錄(圖3-10)。接着我們進入/tmp/aa目錄中創建一個test.txt文件,然後等10秒後執行“clean”命令,此時我們發現/tmp/aa/目錄中的所有文件都已經清理了(圖3-11)。
# systemd-tmpfiles --clean
【講清楚,說明白!】計劃任務crontab及企業實戰應用
【講清楚,說明白!】計劃任務crontab及企業實戰應用
(3.7)如果我們在/tmp/aa目錄下再創建一個目錄rh124並在目錄中創建一個文件,然後等待10秒後重新修改目錄最後的訪問時間,接着再次去執行systemd-tmpfiles的清理臨時文件的操作。此時由於rh124目錄沒有超過10秒,目錄中的文件testRH124.txt文件超過了10秒,執行清理文件的命令後,我們發現rh124仍然是存在的,但是目錄下的文件testRH124.txt已經清理了。
【講清楚,說明白!】計劃任務crontab及企業實戰應用
(3.8)由於在執行“systemd-tmpfiles”相關的命令時會讀取三個目錄包括:/usr/lib/tmpfiles.d/目錄、/run/tmpfiles.d/目錄、/etc/tmpfiles.d/目錄下的所有的配置文件的信息。而如果我們只想讀取某一個特定的配置文件進行執行,則可以在最後指定特定的配置文件名,例如指明aa.conf,那麼就不會清理其他配置文件中的條目。
# systemd-tmpfiles --clean aa.conf---我們可以加上aa.conf,指明只是執行清理aa.conf配置文件中條目
【講清楚,說明白!】計劃任務crontab及企業實戰應用
(3.9)當然我們在/etc/tmpfiles.d/目錄下創建好aa.conf配置文件後,系統也是會定期對我們所創建的配置文件中的條目進行清理的。在/usr/lib/systemd/system這個目錄中存放了定期執行配置文件的文件(圖3-14),例如“OnBootSec=15min”表示開機後15分鐘會執行systemd-tmpfiles-clean的操作(圖3-15)。當然/usr/lib/systemd/system目錄中包含定期執行的文件的執行範圍默認是對應/usr/lib/tmpfiles.d/目錄、/run/tmpfiles.d/目錄、/etc/tmpfiles.d/目錄下的所有的配置文件中的條目的。
# cd /usr/lib/systemd/system
# vim systemd-tmpfiles-clean.timer
【講清楚,說明白!】計劃任務crontab及企業實戰應用
【講清楚,說明白!】計劃任務crontab及企業實戰應用

—————— 本文至此結束,感謝閱讀 ——————

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章