Linux計(jì)劃任務(wù)(1)

01 何為計(jì)劃任務(wù)


計(jì)劃任務(wù),顧名思義:計(jì)劃在未來(lái)某個(gè)時(shí)間點(diǎn)要執(zhí)行的任務(wù),也可稱為定時(shí)任務(wù)。有一次性的計(jì)劃任務(wù),也有周期性的計(jì)劃任務(wù)。

一次性的計(jì)劃任務(wù)就相當(dāng)于待辦,如今天下午三點(diǎn)開(kāi)會(huì),那么它只會(huì)在今天下午三點(diǎn)提醒一次;周期性的計(jì)劃任務(wù)就和我們手機(jī)鬧鐘一樣,如設(shè)置工作日7點(diǎn)整的鬧鐘,那么每個(gè)工作日7點(diǎn)整鬧鐘都會(huì)準(zhǔn)時(shí)響。

但我們平常說(shuō)的計(jì)劃任務(wù)大多是指周期性的計(jì)劃任務(wù),用來(lái)執(zhí)行那些需要重復(fù)執(zhí)行的命令和工作,如定時(shí)重啟、打包、清理日志等等,大大滿足了日常運(yùn)維需求。

在Linux中,一次性的計(jì)劃任務(wù)由at和batch命令完成;而周期性的計(jì)劃任務(wù)則涉及到兩個(gè)服務(wù),分別是crond和anacron。今天我們要講的是crond服務(wù),對(duì)應(yīng)的命令是crontab命令。

crond 服務(wù)是 Linux 下用來(lái)周期地執(zhí)行某種任務(wù)或等待處理某些事件的一個(gè)守護(hù)進(jìn)程,和 Windows 中的計(jì)劃任務(wù)有些類似。在安裝完操作系統(tǒng)后,默認(rèn)會(huì)安裝 crond 服務(wù)工具,且 crond 服務(wù)默認(rèn)就是自啟動(dòng)的。crond 服務(wù)每分鐘會(huì)定期檢查是否有要執(zhí)行的任務(wù),如果有,則會(huì)自動(dòng)執(zhí)行該任務(wù)。

02 crond配置文件


Linux下的任務(wù)調(diào)度分為兩類,系統(tǒng)任務(wù)調(diào)度和用戶任務(wù)調(diào)度,其對(duì)應(yīng)的配置文件和目錄也各不相同。

系統(tǒng)任務(wù)調(diào)度

系統(tǒng)任務(wù)調(diào)度,系統(tǒng)周期性要執(zhí)行的動(dòng)作,配置文件為/etc/crontab,該配置為全局性的。

可以看到,該配置文件已經(jīng)在注釋中告訴我們,這個(gè)配置文件是系統(tǒng)層面的crontab,與其他crontab不同(即用戶任務(wù)調(diào)度),在編輯此文件和/etc/cron.d/目錄中的文件時(shí),不必運(yùn)行crontab命令。這些文件還額外具有一個(gè)用戶名字段,但其他crontab都沒(méi)有。

接著就是一些環(huán)境變量的設(shè)置。SHELL變量指定使用哪種shell,PATH變量指定系統(tǒng)執(zhí)行命令的路徑。MAILTO變量指定crond的任務(wù)執(zhí)行信息將通過(guò)郵件發(fā)給哪個(gè)用戶。HOME變量指定在執(zhí)行命令或者腳本時(shí)使用的主目錄。

系統(tǒng)計(jì)劃任務(wù)的語(yǔ)法比較簡(jiǎn)單,由三部分組成。前面五個(gè)星號(hào)"*"表示時(shí)間:分時(shí)日月周;接著就是用戶名:以什么身份執(zhí)行,因?yàn)樗侨中缘?,所以必須指明身份;最后就是要?zhí)行的命令command。

在上圖中,"run-parts"命令用來(lái)執(zhí)行指定目錄中的可執(zhí)行腳本,這里引生出了四個(gè)目錄,存放需要定期運(yùn)行的腳本:

/etc/cron.hourly/:每小時(shí)執(zhí)行的腳本

/etc/cron.daily/:每日?qǐng)?zhí)行的腳本

/etc/cron.weekly/:每周執(zhí)行的腳本

/etc/cron.monthly/:每月執(zhí)行的腳本

我們以/etc/cron.daily/目錄為例,該目錄下存放的是每日運(yùn)行的可執(zhí)行腳本,其內(nèi)容就是要執(zhí)行的命令。(具備執(zhí)行權(quán)限)

另外除了/etc/crontab配置文件,我們還可以在/etc/cron.d/目錄中存放系統(tǒng)層面的crontab文件。(不具備執(zhí)行權(quán)限,注意和上面四個(gè)目錄中的文件區(qū)分)

兩者的語(yǔ)法一致。我們通常不會(huì)去修改/etc/crontab文件,而是去操作/etc/cron.d/目錄下的crontab文件。該目錄下的計(jì)劃任務(wù),相對(duì)"run-parts"命令涉及到的四個(gè)目錄中的計(jì)劃任務(wù),有更自由的調(diào)度。

用戶任務(wù)調(diào)度

用戶任務(wù)調(diào)度,用戶自定義的周期性動(dòng)作,配置文件存放在/var/spool/cron/目錄(或子目錄/var/spool/cron/crontabs/),文件名與用戶名一致。

雖然都是crontab文件,但不能直接對(duì)其進(jìn)行編輯,而是通過(guò)運(yùn)行crontab命令對(duì)其進(jìn)行編輯。

這里提示沒(méi)有用戶自定義的計(jì)劃任務(wù),在下面的章節(jié),我們會(huì)使用crontab命令來(lái)創(chuàng)建用戶的crontab,同時(shí)掌握其語(yǔ)法。

其他文件

除了以上兩種,crond服務(wù)還涉及以下目錄和文件。

/etc/cron.deny:黑名單。如果該文件存在,則其中的用戶不允許使用crontab命令

/etc/cron.allow:白名單。如果該文件存在,則只有其中的用戶允許使用crontab命令

如果兩個(gè)文件都不存在,則只有超級(jí)用戶允許使用

語(yǔ)法很簡(jiǎn)單,每行一個(gè)用戶名即可。

03 crontab命令使用


crontab命令用于維護(hù)每個(gè)用戶的crontab文件,它的使用比較簡(jiǎn)單,如下是各選項(xiàng)的用法,我們熟練使用前面四個(gè)選項(xiàng)即可。

crontab -e:編輯該用戶的crontab,指定crontab不存在時(shí)則新建

crontab -l:列出該用戶的crontab

crontab -r:刪除該用戶的crontab

crontab -u:指定要對(duì)哪個(gè)用戶的crontab進(jìn)行操作

crontab -i:刪除crontab之前彈出對(duì)話框

首先是"-u"選項(xiàng),在不添加該選項(xiàng)時(shí),默認(rèn)是對(duì)當(dāng)前用戶的計(jì)劃任務(wù)進(jìn)行操作。如下圖:當(dāng)前用戶為root,直接使用"-l"選項(xiàng),提示root沒(méi)有crontab;添加"-u"選項(xiàng),則列出指定用戶kali的計(jì)劃任務(wù)。(需要注意的是,只有管理員權(quán)限才能使用"-u"選項(xiàng),其他用戶使用需要sudo)

由于用戶kali也沒(méi)有計(jì)劃任務(wù),所以同樣提示沒(méi)有kali的crontab。這里我們需要使用"-e"選項(xiàng),為用戶kali新建計(jì)劃任務(wù)。

在新建計(jì)劃任務(wù)之前,我們需要詳細(xì)了解用戶crontab文件的語(yǔ)法。用戶crontab語(yǔ)法和系統(tǒng)crontab語(yǔ)法差不多,只是少了一個(gè)用戶名字段而已。command部分沒(méi)啥好講的,我們重點(diǎn)講時(shí)間的設(shè)置。

第五個(gè)時(shí)間字段,也就是星期字段,數(shù)字0和7均代表星期天,還可以用星期的英文來(lái)表示星期幾。另外,五個(gè)時(shí)間字段中除了可以使用數(shù)字,還可以使用如下幾個(gè)特殊字符。

星號(hào)(*):代表取值范圍內(nèi)的值(任意/每)。

逗號(hào)(,):一個(gè)列表。

中杠(-):一個(gè)范圍。

正斜線(/):間隔頻率。

下面我們舉例來(lái)理解這幾個(gè)特殊字符的使用場(chǎng)景。

每分鐘執(zhí)行一次命令

* * * * * command? ? (*表示任意時(shí)間,每;最小單位為每分鐘)

每天的2點(diǎn)整執(zhí)行一次命令

02* * * command

每個(gè)月的1號(hào)的2點(diǎn)整執(zhí)行一次命令

021* * command

每2分鐘執(zhí)行一次命令

*/2* * * * command ? ?(/表示時(shí)間間隔,每num執(zhí)行一次)

每小時(shí)的第2和第8分鐘時(shí)執(zhí)行一次命令

2,8* * * * command(,表示列表,在num1,num2,...的時(shí)候執(zhí)行一次)

每天2點(diǎn)到8點(diǎn)之間,每分鐘執(zhí)行一次命令

*2-8* * * command(-表示范圍,在num1到num2之間的某種條件下執(zhí)行一次)

每個(gè)月的、5和6號(hào)的、3到4點(diǎn)之間,每2分鐘執(zhí)行一次命令

*/23-45,6* * command ? ?(組合使用)

特殊字符可以單獨(dú)使用,也可以組合使用,篇幅關(guān)系,就不一一列舉,大家學(xué)會(huì)舉一反三。五個(gè)字段都是對(duì)時(shí)間進(jìn)行操作,只是取值范圍和單位不一樣而已。

介紹了時(shí)間字段的語(yǔ)法,接下來(lái)我們使用"-e"選項(xiàng)來(lái)為用戶新建crontab。

第一次操作時(shí),系統(tǒng)會(huì)要求我們選擇編輯器,選擇自己熟練的編輯器即可;選擇之后會(huì)進(jìn)入到crontab文件編輯的界面,我們?cè)谖募邪凑照Z(yǔ)法添加計(jì)劃任務(wù),保存退出即可。(這里我沒(méi)有放截圖,大家敲下命令就知道了)

再次使用"-l"選項(xiàng),直接列出crontab內(nèi)容,上面的注釋為系統(tǒng)自動(dòng)生成,只有最后一句是我手工添加的。需要注意的是,不同系統(tǒng),crontab命令打開(kāi)的crontab文件內(nèi)容不一定相同,有的可能沒(méi)有注釋,有的第一次使用可能不需要選擇編輯器就直接進(jìn)入crontab文件編輯界面了。(當(dāng)然選擇哪個(gè)編輯器也可以我們?nèi)斯づ渲茫@里不是我們要講的知識(shí)點(diǎn))

查看/var/spool/cron/crontabs目錄,發(fā)現(xiàn)存在一個(gè)名為kali的crontab文件。

使用"-r"選項(xiàng)刪除用戶的crontab,注意該選項(xiàng)直接刪除crontab文件,而不是刪除其中的某條。因此刪除之后,名為kali的crontab文件將從目錄中刪除。

04 總結(jié)


計(jì)劃任務(wù)的配置文件和目錄涉及較多,以前沒(méi)接觸過(guò)的校友一時(shí)半會(huì)兒可能無(wú)法很好的吸收,大家可以帶著以下幾個(gè)問(wèn)題去理解記憶。

問(wèn)題1:任務(wù)調(diào)度分哪兩種?

答:系統(tǒng)任務(wù)調(diào)度、用戶任務(wù)調(diào)度

問(wèn)題2:不同計(jì)劃任務(wù)的配置文件分別是?

答:系統(tǒng)/etc/crontab、用戶/var/spool/cron/*

問(wèn)題3:還涉及到哪些文件和目錄?

答:

/etc/cron.d/*

/etc/cron.hourly/*

/etc/cron.daily/*

/etc/cron.weekly/*

/etc/cron.monthly/*

問(wèn)題4:?jiǎn)栴}3中各目錄的區(qū)別?

答:/etc/cron.d/存放crontab文件,其他目錄存放需周期性運(yùn)行的可執(zhí)行腳本

問(wèn)題5:計(jì)劃任務(wù)的黑白名單是哪兩個(gè)文件?

答:/etc/cron.deny、/etc/cron.allow

計(jì)劃任務(wù)的知識(shí)如果要深講,還有很多可以講的。不過(guò)大家掌握以上五個(gè)問(wèn)題+語(yǔ)法+crontab命令,就足夠了。如果感興趣,大家可以去查閱官方的手冊(cè)進(jìn)行知識(shí)的補(bǔ)充。

05?免責(zé)聲明


安全小白團(tuán)是幫助用戶了解信息安全技術(shù)、安全漏洞相關(guān)信息的微信公眾號(hào)。安全小白團(tuán)提供的程序(方法)可能帶有攻擊性,僅供安全研究與教學(xué)之用,用戶將其信息做其他用途,由用戶承擔(dān)全部法律及連帶責(zé)任,安全小白團(tuán)不承擔(dān)任何法律及連帶責(zé)任。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容