您好,登錄后才能下訂單哦!
這篇文章主要介紹“Linux定時任務的檢查方式是什么”,在日常操作中,相信很多人在Linux定時任務的檢查方式是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Linux定時任務的檢查方式是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
大多數人都用過 Crontab:crontab -e / -l,所以這里就不介紹了,也不贅述使用方式了。
要想完整的列出 crontab,最好還是從 crontab 保存的定時任務文件入手。
Crontab 相關的文件分別在 /etc、/var/spool/cron/ 下:
/etc/
/etc/cron.hourly/0anacron: anacron 下面會講
/etc/cron.d/0hourly: 自帶的,其實就是用 run-parts 去執行 /etc/cron.hourly 下面的腳本
...(可能有其他用戶把定時任務放在這下面)
/etc/cron.allow: 相當于白名單,限制類配置,不在這里面的用戶不能使用 crontab
/etc/cron.deny: 相當于黑名單,限制類配置,在這里面的用戶不能使用 crontab
/etc/crontab: 系統級別的定時任務配置,可以理解為大家一起用的定時任務,所有權是系統而不是特定的某用戶
/etc/cron.d/: 這個文件夾下的配置同 /etc/crontab。假如你有個定時任務不想直接寫到 /etc/crontab里,那么你可以選擇新建一個文件,放在 /etc/cron.d/ 里面(無需其他配置,直接生效)。
/etc/cron.hourly/: 被 /etc/cron.d/0hourly 執行。里面是可執行文件或者 shell 腳本。
/etc/cron.daily、/etc/cron.weekly、/etc/cron.monthly: 看起來和 crontab 有關系?其實是 anacron的!下面會講
/var/spool/cron/: 存放每個用戶的 crontab,所有權是特定的用戶(注意與 /etc/crontab 對比)。這個就是我們在用 crontab -e 的時候創建/編輯的文件,所以文件名就是用戶名,并且執行的時候是用文件名(即用戶名)的權限來執行的,例如你在下面建了一個名叫 Tr0y 的文件,則會以 Tr0y 的身份去執行這個文件里的定時任務。需要注意的是,如果你在這個目錄下強行創建了一個以不存在的用戶名為命名的文件,例如 test,但是你又沒有這個用戶的話,test 里面的定時任務是不會執行的。另一個需要注意的是,/var/spool/cron/ 的所有權是 root,所以普通用戶是沒辦法直接在下面創建文件的,只能加 sudo 或者通過 crontab -e。
...(各個用戶的 crontab)
注意,/etc/cron.allow 的優先級比 /etc/cron.deny 要高,所以配置只需要選擇一種來限制即可。一般來說,系統的用戶相對可靠,故默認保留的是 /etc/cron.deny,且內容為空,這樣所有人都能用 crontab。如果這兩個限制文件都不存在,那么只有 root 才能使用 crontab。
最后需要注意的是,cron 是不會遞歸文件夾的,所以你在 /etc/cron.d/ 和 /var/spool/cron/ 下面建文件夾,再在里面放配置文件是沒用的。為什么要特別提到這一點?因為我見過有攻擊者這么干過...
1. 使用 /etc/cron.allow 來指定可使用 crontab 的用戶(最好不要使用黑名單的/etc/cron.deny)。需要注意的是,此文件一定要是 root 所有。
2. 檢查 crontab 的時候,分別檢查:/etc/crontab、/etc/cron.d/*、/var/spool/cron/*。
3. 檢查是否有除了 /etc/cron.hourly/0anacron 之外的 anacron 定時任務(下面會提)
Anacron 可能大家用的少一點,所以會說的多一些。
它與 Crontab 最大的不同在于,它會去執行那些落下的定時任務。舉個例子,假如你設定了一個 Crontab 定時任務,在每周六晚上 6 點執行。但是正好周六晚上 5 點到 7 點停電了,那么這個定時任務相當于這一輪就沒有執行。但是如果你用的是 Anacron,它會去檢查并執行那些沒有執行過的定時任務。實際上,Anacron 是每個小時被 crond(Crontab 服務)執行一次,然后 Anacron 再去檢測相關的定時任務有沒有被執行,如果有超期沒被執行的工作,就執行該定時任務。
Anacron 其實僅僅是一個程序,不像 Crontab 那樣利用 crond 服務執行。之前在 Crontab 里提到過,有個自帶的每一個小時執行一次的定時任務集 合:/etc/cron.d/0hourly,而這個定時任務其實就是用 run-parts 去執行 /etc/cron.hourly 下面的腳本,這里面自帶一個 0anacron,其實就是這一節提到的 Anacron。所以 Anacron 其實是依托于 Crontab 去定時執行的。0anacron 如下:
#!/bin/sh # Check whether 0anacron was run today already if test -r /var/spool/anacron/cron.daily; then day=cat /var/spool/anacron/cron.daily fi if [ date +%Y%m%d = "$day" ]; then exit 0; fi # --- 上面這部分就是我說的檢測定時任務是否執行過的邏輯 --- # Do not run jobs when on battery power if test -x /usr/bin/on_ac_power; then /usr/bin/on_ac_power >/dev/null 2>&1 if test $? -eq 1; then exit 0 fi fi /usr/sbin/anacron -s
# 所以這個腳本其實執行的就是 anacron -s...
各位可能會覺得很奇怪,為啥這個名字最前面要加個 0。根據網上的說法,0 開頭的定時任務會排在最前面執行,這樣的話,就避免了有些 Crontab 定時任務執行過之后,Anacron 誤以為 Crontab 沒執行,導致重復執行某些定時任務。包括命令之前加上 nice 讓它優先獲得 cpu 以便執行,也是出于這個目的。
/etc/anacrontab: 與 /etc/crontab 類似,自帶,通過 run-parts 執行 /etc/cron.daily、/etc/cron.weekly、/etc/cron.monthly。
/var/spool/anacron/: 記錄上面幾個的執行時間,內容就是年月日
/var/spool/anacron/cron.daily
/var/spool/anacron/cron.monthly
/var/spool/anacron/cron.weekly
anacrontab 可以通過 -t 參數指定 /etc/anacrontab 的位置,默認就是 /etc/anacrontab
簡單解釋一下 /etc/anacrontab 的內容吧:
SHELL=/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root RANDOM_DELAY=45 # 執行之前隨機延遲時間(分鐘,可分散服務器的壓力) START_HOURS_RANGE=3-22 # 允許執行命令的時間段(這里是 3 點 - 22 點才能執行) 1 5 cron.daily nice run-parts /etc/cron.daily # 1: 每隔多久執行(天) # 5: 固定延遲時間(分鐘) # cron.daily: 定時任務名稱,隨便設置,主要是看 log (/var/log/cron 的時候可能有用) # nice run-parts /etc/cron.daily: 定時任務的核心 —— 要執行的命令
與 /etc/cron.d/0hourly 挺像的,同時名字最前面加 0 這個邏輯也是一樣的。
以 cron.daily 為例,對照上面這個配置,總結一下 Anacron 的運行流程:
crond 讀取 /etc/crontab、/var/spool/cron/*、/etc/cron.d/*,根據設定的時間執行
執行到 /etc/cron.d/0hourly 的時候,執行 /etc/cron.hourly/ 下的所有可執行文件,其中就有 0anacron
0anacron 執行 anacron
anacron 讀取 /etc/anacrontab,它指定了 cron.daily 執行間隔為 1 天
從 /var/spool/anacron/cron.daily 取出最近一次執行 anacron 的時間
比較當前時間與上一步獲得的時間,若相差 1 天以上 (含 1 天),則準備執行指定的定時任務。
根據 /etc/anacrontab 的設置,執行之前要先延時 5 分鐘 + n 分鐘(n 為不超過 45 的隨機數)
延時到點之后,開始執行指定的命令,即 nice run-parts /etc/cron.daily
執行完畢,結束
最后,anacrontab 僅能用 root 權限配置。
anacrontab 的執行比較佛系,最快也就是一天執行一次(除非加上了-f,強制每輪檢查都執行),所以惡意軟件通常不想用這個去做持久化。不過也不好說,誰讓它比 crontab 隱蔽呢?
檢查 /etc/anacrontab 下是否有疑似惡意的定時任務
檢查 /etc/cron.hourly/0anacron 是否利用-t自定義了 anacrontab 定時任務文件位置,如果有也要檢查這個自定義的文件。
at 依賴于 atd 服務執行,這點與 crontab 有點像,但現在似乎不是默認啟用 atd 的,所以可能需要手動啟動(systemctl start atd)。它與前兩個最大的區別在于 at 是一次性的,設定完之后只會運行一次。
/etc/at.allow: 相當于白名單,限制類配置,不在這里面的用戶不能使用 at
/etc/at.deny: 相當于黑名單,限制類配置,在這里面的用戶不能使用 at
/var/spool/at/: 保存定時任務的文件夾。下面用特定格式的文件名存放定時任務詳情,包括命令、環境變量、設定定時任務時的路徑等。
/var/spool/at/spool: 據說是保存輸出的文件夾...至于是什么輸出、什么時候會輸出到這里就不得而知了...
示例:a000030196c020。這個文件名的格式暫時沒找到資料,不過經過我的測試,格式應該為,a(固定)+00011(任務每加一個這里要+1)+從 1970-01-01 08:00:00 至 任務執行時間 的分鐘數(8 位,位數不夠在前面補 0) (注意這里面計算都是十六進制的)
上面的兩個限制文件個 crontab 類似,也是 allow 的優先級比 deny 要高,如果這兩個限制文件都不存在,那么只有 root 才能使用 at。
當然,你也可以不用 at 來新建定時任務,只要往 /var/spool/at/ 下面新建文件,注意權限要有 x,且得是 root 才能這么創建,至于文件名,一定要按照上面的規則才能被識別。示例,若我們想建一個在 2030-01-01 08:00:00 執行的定時任務。先計算一下時間差:
In [27]: import datetime In [28]: delta = datetime.datetime.strptime('2030-01-01 08:00:00', "%Y-%m-%d %H:%M:%S") - datetime.datetime.strptime('1970-01-01 0 ...: 8:00:00', "%Y-%m-%d %H:%M:%S") In [29]: hex(delta.days * 24 * 60) # 轉分鐘 Out[29]: '0x1e187e0'
補齊至 8 位:01e187e0。
所以這個定時任務的格式應該為 a+00012(上一個任務+1)+01e187e0(時間差) = a0001201e187e0:
? at atq ? at vim a0001201e187e0 ? at atq 18 Tue Jan 1 08:00:00 2030 a root
各位如果比較敏感的話,就會想到 8 位的 hex,會不會出現類似千年蟲的 bug 呢?0xffffffff = 4294967295 年,43 億年,嗯,各位是等不到了。
最后有幾點要提一下:
如果 at 定時任務執行沒有成功,似乎會變成=開頭的定時任務(原來是a開頭的)
執行時間在過去的定時任務是不會被執行的
在直接寫 at 定時任務的時候,要注意開頭要有這三行:
#!/bin/sh # shell # atrun uid=0 gid=0 # 應該是表明計劃任務的擁有者的權限,未考證 # mail root 0 # 觸發發郵件的邏輯時,收件人是誰
4. 與 at 相關的還有一個 batch 命令,通過它設定的 at 定時任務,只有在 cpu 負載小于 0.8 的時候才會運 行,且文件名則會以 b 開頭。其實原理都是一樣的,batch 也是用 at 來配置定時任務的:
? at echo 'echo <0001f382> > /dev/pts/8' | batch && ls job 32 at Mon Aug 3 17:35:00 2020 b000200195ff5f spool
at 的可讀性還是很好的,例如你可以給自己發一個生日祝福:
? ~ echo 'echo <0001f382> > /dev/pts/8' | at 00:00 September 7 job 1 at Mon Aug 3 14:02:00 2020 ? ~ atq 1 Mon Sep 7 00:00:00 2020 a root ? ~ ls /var/spool/at/ a000010195fe8a spool ? ~ cat /var/spool/at/a000010195fe8a #!/bin/sh # atrun uid=0 gid=0 # mail root 0 ... cd /root || { echo 'Execution directory inaccessible' >&2 exit 1 } ... echo <0001f382> > /dev/pts/8 ...
到此,關于“Linux定時任務的檢查方式是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。