自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

在Linux中怎么使用cron計(jì)劃任務(wù)

系統(tǒng) Linux 系統(tǒng)運(yùn)維
沒(méi)有時(shí)間運(yùn)行命令?使用 cron 的計(jì)劃任務(wù)意味著你不用熬夜程序也可以運(yùn)行。在這篇文章中,我將介紹 cron 服務(wù)和怎么去使用它。

[[210911]]

沒(méi)有時(shí)間運(yùn)行命令?使用 cron 的計(jì)劃任務(wù)意味著你不用熬夜程序也可以運(yùn)行。

系統(tǒng)管理員(在許多好處中)的挑戰(zhàn)之一是在你該睡覺(jué)的時(shí)候去運(yùn)行一些任務(wù)。例如,一些任務(wù)(包括定期循環(huán)運(yùn)行的任務(wù))需要在沒(méi)有人使用計(jì)算機(jī)資源的時(shí)候去運(yùn)行,如午夜或周末。在下班后,我沒(méi)有時(shí)間去運(yùn)行命令或腳本。而且,我也不想在晚上去啟動(dòng)備份或重大更新。

取而代之的是,我使用兩個(gè)服務(wù)功能在我預(yù)定的時(shí)間去運(yùn)行命令、程序和任務(wù)。cron 和 at 服務(wù)允許系統(tǒng)管理員去安排任務(wù)運(yùn)行在未來(lái)的某個(gè)特定時(shí)間。at 服務(wù)指定在某個(gè)時(shí)間去運(yùn)行一次任務(wù)。cron 服務(wù)可以安排任務(wù)在一個(gè)周期上重復(fù),比如天、周、或月。

在這篇文章中,我將介紹 cron 服務(wù)和怎么去使用它。

常見(jiàn)(和非常見(jiàn))的 cron 用途

我使用 cron 服務(wù)去安排一些常見(jiàn)的事情,比如,每天凌晨 2:00 發(fā)生的定期備份,我也使用它去做一些不常見(jiàn)的事情。

  • 許多電腦上的系統(tǒng)時(shí)鐘(比如,操作系統(tǒng)時(shí)間)都設(shè)置為使用網(wǎng)絡(luò)時(shí)間協(xié)議(NTP)。 NTP 設(shè)置系統(tǒng)時(shí)間后,它不會(huì)去設(shè)置硬件時(shí)鐘,它可能會(huì)“漂移”。我使用 cron 基于系統(tǒng)時(shí)間去設(shè)置硬件時(shí)鐘。
  • 我還有一個(gè) Bash 程序,我在每天早晨運(yùn)行它,去在每臺(tái)電腦上創(chuàng)建一個(gè)新的 “每日信息” (MOTD)。它包含的信息有當(dāng)前的磁盤使用情況等有用的信息。
  •  許多系統(tǒng)進(jìn)程和服務(wù),像 Logwatch、logrotate、和 Rootkit Hunter,使用 cron 服務(wù)去安排任務(wù)和每天運(yùn)行程序。

crond 守護(hù)進(jìn)程是一個(gè)完成 cron 功能的后臺(tái)服務(wù)。

cron 服務(wù)檢查在 /var/spool/cron 和 /etc/cron.d 目錄中的文件,以及 /etc/anacrontab 文件。這些文件的內(nèi)容定義了以不同的時(shí)間間隔運(yùn)行的 cron 作業(yè)。個(gè)體用戶的 cron 文件是位于 /var/spool/cron,而系統(tǒng)服務(wù)和應(yīng)用生成的 cron 作業(yè)文件放在 /etc/cron.d 目錄中。/etc/anacrontab 是一個(gè)特殊的情況,它將在本文中稍后部分介紹。

使用 crontab

cron 實(shí)用程序運(yùn)行基于一個(gè) cron 表(crontab)中指定的命令。每個(gè)用戶,包括 root,都有一個(gè) cron 文件。這些文件缺省是不存在的。但可以使用 crontab -e 命令創(chuàng)建在 /var/spool/cron 目錄中,也可以使用該命令去編輯一個(gè) cron 文件(看下面的腳本)。我強(qiáng)烈建議你,不要使用標(biāo)準(zhǔn)的編輯器(比如,Vi、Vim、Emacs、Nano、或者任何其它可用的編輯器)。使用 crontab 命令不僅允許你去編輯命令,也可以在你保存并退出編輯器時(shí),重啟動(dòng) crond 守護(hù)進(jìn)程。crontab 命令使用 Vi 作為它的底層編輯器,因?yàn)?Vi 是預(yù)裝的(至少在大多數(shù)的基本安裝中是預(yù)裝的)。

現(xiàn)在,cron 文件是空的,所以必須從頭添加命令。 我增加下面示例中定義的作業(yè)到我的 cron 文件中,這是一個(gè)快速指南,以便我知道命令中的各個(gè)部分的意思是什么,你可以自由拷貝它,供你自己使用。

  1. # crontab -e 
  2. SHELL=/bin/bash 
  3. MAILTO=root@example.com 
  4. PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin 
  5. For details see man 4 crontabs 
  6. # Example of job definition: 
  7. # .---------------- minute (0 - 59) 
  8. # |  .------------- hour (0 - 23) 
  9. # |  |  .---------- day of month (1 - 31) 
  10. # |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ... 
  11. # |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat 
  12. # |  |  |  |  | 
  13. # *  *  *  *  * user-name  command to be executed 
  14. # backup using the rsbu program to the internal 4TB HDD and then 4TB external 
  15. 01 01 * * * /usr/local/bin/rsbu -vbd1 ; /usr/local/bin/rsbu -vbd2 
  16. Set the hardware clock to keep it in sync with the more accurate system clock 
  17. 03 05 * * * /sbin/hwclock --systohc 
  18. # Perform monthly updates on the first of the month 
  19. # 25 04 1 * * /usr/bin/dnf -y update 

crontab 命令用于查看或編輯 cron 文件。

上面代碼中的前三行設(shè)置了一個(gè)缺省環(huán)境。對(duì)于給定用戶,環(huán)境變量必須是設(shè)置的,因?yàn)?,cron 不提供任何方式的環(huán)境。SHELL 變量指定命令運(yùn)行使用的 shell。這個(gè)示例中,指定為 Bash shell。MAILTO 變量設(shè)置發(fā)送 cron 作業(yè)結(jié)果的電子郵件地址。這些電子郵件提供了 cron 作業(yè)(備份、更新、等等)的狀態(tài),和你從命令行中手動(dòng)運(yùn)行程序時(shí)看到的結(jié)果是一樣的。第三行為環(huán)境設(shè)置了 PATH 變量。但即使在這里設(shè)置了路徑,我總是使用每個(gè)程序的完全限定路徑。

在上面的示例中有幾個(gè)注釋行,它詳細(xì)說(shuō)明了定義一個(gè) cron 作業(yè)所要求的語(yǔ)法。我將在下面分別講解這些命令,然后,增加更多的 crontab 文件的高級(jí)特性。

  1. 01 01 * * * /usr/local/bin/rsbu -vbd1 ; /usr/local/bin/rsbu -vbd2 

在我的 /etc/crontab 中的這一行運(yùn)行一個(gè)腳本,用于為我的系統(tǒng)執(zhí)行備份。

這一行運(yùn)行我自己編寫的 Bash shell 腳本 rsbu,它對(duì)我的系統(tǒng)做完全備份。這個(gè)作業(yè)每天的凌晨 1:01 (01 01) 運(yùn)行。在這三、四、五位置上的星號(hào)(*),像文件通配符一樣代表一個(gè)特定的時(shí)間,它們代表 “一個(gè)月中的每天”、“每個(gè)月” 和 “一周中的每天”,這一行會(huì)運(yùn)行我的備份兩次,一次備份內(nèi)部專用的硬盤驅(qū)動(dòng)器,另外一次運(yùn)行是備份外部的 USB 驅(qū)動(dòng)器,使用它這樣我可以很保險(xiǎn)。

接下來(lái)的行我設(shè)置了一個(gè)硬件時(shí)鐘,它使用當(dāng)前系統(tǒng)時(shí)鐘作為源去設(shè)置硬件時(shí)鐘。這一行設(shè)置為每天凌晨 5:03 分運(yùn)行。

 

  1. 03 05 * * * /sbin/hwclock --systohc 

這一行使用系統(tǒng)時(shí)間作為源來(lái)設(shè)置硬件時(shí)鐘。

我使用的第三個(gè)也是***一個(gè)的 cron 作業(yè)是去執(zhí)行一個(gè) dnf 或 yum 更新,它在每個(gè)月的***天的凌晨 04:25 運(yùn)行,但是,我注釋掉了它,以后不再運(yùn)行。

  1. # 25 04 1 * * /usr/bin/dnf -y update 

這一行用于執(zhí)行一個(gè)每月更新,但是,我也把它注釋掉了。

其它的定時(shí)任務(wù)技巧

現(xiàn)在,讓我們?nèi)プ鲆恍┍然局R(shí)更有趣的事情。假設(shè)你希望在每周四下午 3:00 去運(yùn)行一個(gè)特別的作業(yè):

  1. 00 15 * * Thu /usr/local/bin/mycronjob.sh 

這一行會(huì)在每周四下午 3:00 運(yùn)行 mycronjob.sh 這個(gè)腳本。

或者,或許你需要在每個(gè)季度末去運(yùn)行一個(gè)季度報(bào)告。cron 服務(wù)沒(méi)有為 “每個(gè)月的***一天” 設(shè)置選項(xiàng),因此,替代方式是使用下一個(gè)月的***天,像如下所示(這里假設(shè)當(dāng)作業(yè)準(zhǔn)備運(yùn)行時(shí),報(bào)告所需要的數(shù)據(jù)已經(jīng)準(zhǔn)備好了)。

  1. 02 03 1 1,4,7,10 * /usr/local/bin/reports.sh 

在季度末的下一個(gè)月的***天運(yùn)行這個(gè) cron 作業(yè)。

下面展示的這個(gè)作業(yè),在每天的上午 9:01 到下午 5:01 之間,每小時(shí)運(yùn)行一次。

  1. 01 09-17 * * * /usr/local/bin/hourlyreminder.sh 

有時(shí),你希望作業(yè)在業(yè)務(wù)期間定時(shí)運(yùn)行。

我遇到一個(gè)情況,需要作業(yè)在每二、三或四小時(shí)去運(yùn)行。它需要用期望的間隔去劃分小時(shí),比如, */3 為每三個(gè)小時(shí),或者 6-18/3 為上午 6 點(diǎn)到下午 6 點(diǎn)每三個(gè)小時(shí)運(yùn)行一次。其它的時(shí)間間隔的劃分也是類似的。例如,在分鐘位置的表達(dá)式 */15 意思是 “每 15 分鐘運(yùn)行一次作業(yè)”。

  1. */5 08-18/2 * * * /usr/local/bin/mycronjob.sh 

這個(gè) cron 作業(yè)在上午 8:00 到下午 18:59 之間,每五分鐘運(yùn)行一次作業(yè)。

需要注意的一件事情是:除法表達(dá)式的結(jié)果必須是余數(shù)為 0(即整除)。換句話說(shuō),在這個(gè)例子中,這個(gè)作業(yè)被設(shè)置為在上午 8 點(diǎn)到下午 6 點(diǎn)之間的偶數(shù)小時(shí)每 5 分鐘運(yùn)行一次(08:00、08:05、 08:10、 08:15……18:55 等等),而不運(yùn)行在奇數(shù)小時(shí)。另外,這個(gè)作業(yè)不能運(yùn)行在下午 7:00 到上午 7:59 之間。(LCTT 譯注:此處本文表述有誤,根據(jù)正確情況修改)

我相信,你可以根據(jù)這些例子想到許多其它的可能性。

限制訪問(wèn) cron

普通用戶使用 cron 訪問(wèn)可能會(huì)犯錯(cuò)誤,例如,可能導(dǎo)致系統(tǒng)資源(比如內(nèi)存和 CPU 時(shí)間)被耗盡。為避免這種可能的問(wèn)題, 系統(tǒng)管理員可以通過(guò)創(chuàng)建一個(gè) /etc/cron.allow 文件去限制用戶訪問(wèn),它包含了一個(gè)允許去創(chuàng)建 cron 作業(yè)的用戶列表。(不管是否列在這個(gè)列表中,)不能阻止 root 用戶使用 cron。

通過(guò)阻止非 root 用戶創(chuàng)建他們自己的 cron 作業(yè),那也許需要將非 root 用戶的 cron 作業(yè)添加到 root 的 crontab 中, “但是,等等!” 你說(shuō),“不是以 root 去運(yùn)行這些作業(yè)?” 不一定。在這篇文章中的***個(gè)示例中,出現(xiàn)在注釋中的用戶名字段可以用于去指定一個(gè)運(yùn)行作業(yè)的用戶 ID。這可以防止特定的非 root 用戶的作業(yè)以 root 身份去運(yùn)行。下面的示例展示了一個(gè)作業(yè)定義,它以 “student” 用戶去運(yùn)行這個(gè)作業(yè):

  1. 04 07 * * * student /usr/local/bin/mycronjob.sh 

如果沒(méi)有指定用戶,這個(gè)作業(yè)將以 contab 文件的所有者用戶去運(yùn)行,在這個(gè)情況中是 root。

cron.d

目錄 /etc/cron.d 中是一些應(yīng)用程序,比如 SpamAssassin 和 sysstat 安裝的 cron 文件。因?yàn)椋@里沒(méi)有 spamassassin 或者 sysstat 用戶,這些程序需要一個(gè)位置去放置 cron 文件,因此,它們被放在 /etc/cron.d 中。

下面的 /etc/cron.d/sysstat 文件包含系統(tǒng)活動(dòng)報(bào)告(SAR)相關(guān)的 cron 作業(yè)。這些 cron 文件和用戶 cron 文件格式相同。

  1. # Run system activity accounting tool every 10 minutes 
  2.  
  3. */10 * * * * root /usr/lib64/sa/sa1 1 1 
  4.  
  5. # Generate a daily summary of process accounting at 23:53 
  6.  
  7. 53 23 * * * root /usr/lib64/sa/sa2 -A 

sysstat 包安裝了 /etc/cron.d/sysstat cron 文件來(lái)運(yùn)行程序生成 SAR。

該 sysstat cron 文件有兩行執(zhí)行任務(wù)。***行每十分鐘去運(yùn)行 sa1 程序去收集數(shù)據(jù),存儲(chǔ)在 /var/log/sa 目錄中的一個(gè)指定的二進(jìn)制文件中。然后,在每天晚上的 23:53, sa2 程序運(yùn)行來(lái)創(chuàng)建一個(gè)每日匯總。

計(jì)劃小貼士

我在 crontab 文件中設(shè)置的有些時(shí)間看上起似乎是隨機(jī)的,在某種程度上說(shuō),確實(shí)是這樣的。嘗試去安排 cron 作業(yè)可能是件很具有挑戰(zhàn)性的事, 尤其是作業(yè)的數(shù)量越來(lái)越多時(shí)。我通常在我的每個(gè)電腦上僅有一些任務(wù),它比起我工作用的那些生產(chǎn)和實(shí)驗(yàn)環(huán)境中的電腦簡(jiǎn)單多了。

我管理的一個(gè)系統(tǒng)有 12 個(gè)每天晚上都運(yùn)行 cron 作業(yè),另外 3、4 個(gè)在周末或月初運(yùn)行。那真是個(gè)挑戰(zhàn),因?yàn)?,如果有太多作業(yè)在同一時(shí)間運(yùn)行,尤其是備份和編譯系統(tǒng),會(huì)耗盡內(nèi)存并且?guī)缀跆顫M交換文件空間,這會(huì)導(dǎo)致系統(tǒng)性能下降甚至是超負(fù)荷,最終什么事情都完不成。我增加了一些內(nèi)存并改進(jìn)了如何計(jì)劃任務(wù)。我還刪除了一些寫的很糟糕、使用大量?jī)?nèi)存的任務(wù)。

crond 服務(wù)假設(shè)主機(jī)計(jì)算機(jī) 24 小時(shí)運(yùn)行。那意味著如果在一個(gè)計(jì)劃運(yùn)行的期間關(guān)閉計(jì)算機(jī),這些計(jì)劃的任務(wù)將不再運(yùn)行,直到它們計(jì)劃的下一次運(yùn)行時(shí)間。如果這里有關(guān)鍵的 cron 作業(yè),這可能導(dǎo)致出現(xiàn)問(wèn)題。 幸運(yùn)的是,在定期運(yùn)行的作業(yè)上,還有一個(gè)其它的選擇: anacron。

anacron

anacron 程序執(zhí)行和 cron 一樣的功能,但是它增加了運(yùn)行被跳過(guò)的作業(yè)的能力,比如,如果計(jì)算機(jī)已經(jīng)關(guān)閉或者其它的原因?qū)е聼o(wú)法在一個(gè)或多個(gè)周期中運(yùn)行作業(yè)。它對(duì)筆記本電腦或其它被關(guān)閉或進(jìn)行睡眠模式的電腦來(lái)說(shuō)是非常有用的。

只要電腦一打開(kāi)并引導(dǎo)成功,anacron 會(huì)檢查過(guò)去是否有計(jì)劃的作業(yè)被錯(cuò)過(guò)。如果有,這些作業(yè)將立即運(yùn)行,但是,僅運(yùn)行一次(而不管它錯(cuò)過(guò)了多少次循環(huán)運(yùn)行)。例如,如果一個(gè)每周運(yùn)行的作業(yè)在最近三周因?yàn)樾菁俣到y(tǒng)關(guān)閉都沒(méi)有運(yùn)行,它將在你的電腦一啟動(dòng)就立即運(yùn)行,但是,它僅運(yùn)行一次,而不是三次。

anacron 程序提供了一些對(duì)周期性計(jì)劃任務(wù)很好用的選項(xiàng)。它是安裝在你的 /etc/cron.[hourly|daily|weekly|monthly] 目錄下的腳本。 根據(jù)它們需要的頻率去運(yùn)行。

它是怎么工作的呢?接下來(lái)的這些要比前面的簡(jiǎn)單一些。

1、 crond 服務(wù)運(yùn)行在 /etc/cron.d/0hourly 中指定的 cron 作業(yè)。

  1. # Run the hourly jobs 
  2. SHELL=/bin/bash 
  3. PATH=/sbin:/bin:/usr/sbin:/usr/bin 
  4. MAILTO=root 
  5. 01 * * * * root run-parts /etc/cron.hourly 

/etc/cron.d/0hourly 中的內(nèi)容使位于 /etc/cron.hourly 中的 shell 腳本運(yùn)行。

2、 在 /etc/cron.d/0hourly 中指定的 cron 作業(yè)每小時(shí)運(yùn)行一次 run-parts 程序。

3、 run-parts 程序運(yùn)行所有的在 /etc/cron.hourly 目錄中的腳本。

4、 /etc/cron.hourly 目錄包含的 0anacron 腳本,它使用如下的 /etdc/anacrontab 配置文件去運(yùn)行 anacron 程序。   

  1. # /etc/anacrontab: configuration file for anacron 
  2. # See anacron(8) and anacrontab(5) for details. 
  3. SHELL=/bin/sh 
  4. PATH=/sbin:/bin:/usr/sbin:/usr/bin 
  5. MAILTO=root 
  6. # the maximal random delay added to the base delay of the jobs 
  7. RANDOM_DELAY=45 
  8. # the jobs will be started during the following hours only 
  9. START_HOURS_RANGE=3-22 
  10. #period in days   delay in minutes   job-identifier   command 
  11. 1       5       cron.daily              nice run-parts /etc/cron.daily 
  12. 7       25      cron.weekly             nice run-parts /etc/cron.weekly 
  13. @monthly 45     cron.monthly            nice run-parts /etc/cron.monthly 

/etc/anacrontab 文件中的內(nèi)容在合適的時(shí)間運(yùn)行在 cron.[daily|weekly|monthly] 目錄中的可執(zhí)行文件。

5、 anacron 程序每日運(yùn)行一次位于 /etc/cron.daily 中的作業(yè)。它每周運(yùn)行一次位于 /etc/cron.weekly 中的作業(yè)。以及每月運(yùn)行一次 cron.monthly 中的作業(yè)。注意,在每一行指定的延遲時(shí)間,它可以幫助避免這些作業(yè)與其它 cron 作業(yè)重疊。

我在 /usr/local/bin 目錄中放置它們,而不是在 cron.X 目錄中放置完整的 Bash 程序,這會(huì)使我從命令行中運(yùn)行它們更容易。然后,我在 cron 目錄中增加一個(gè)符號(hào)連接,比如,/etc/cron.daily。

anacron 程序不是設(shè)計(jì)用于在指定時(shí)間運(yùn)行程序的。而是,用于在一個(gè)指定的時(shí)間開(kāi)始,以一定的時(shí)間間隔去運(yùn)行程序,比如,從每天的凌晨 3:00(看上面腳本中的 START_HOURS_RANGE 行)、從周日(每周***天)和這個(gè)月的***天。如果任何一個(gè)或多個(gè)循環(huán)錯(cuò)過(guò),anacron 將立即運(yùn)行這個(gè)錯(cuò)過(guò)的作業(yè)。

更多的關(guān)于設(shè)置限制

我在我的計(jì)算機(jī)上使用了很多運(yùn)行計(jì)劃任務(wù)的方法。所有的這些任務(wù)都需要一個(gè) root 權(quán)限去運(yùn)行。在我的經(jīng)驗(yàn)中,很少有普通用戶去需要運(yùn)行 cron 任務(wù),一種情況是開(kāi)發(fā)人員需要一個(gè) cron 作業(yè)去啟動(dòng)一個(gè)開(kāi)發(fā)實(shí)驗(yàn)室的每日編譯。

限制非 root 用戶去訪問(wèn) cron 功能是非常重要的。然而,在一些特殊情況下,用戶需要去設(shè)置一個(gè)任務(wù)在預(yù)先指定時(shí)間運(yùn)行,而 cron 可以允許他們?nèi)ツ菢幼觥TS多用戶不理解如何正確地配置 cron 去完成任務(wù),并且他們會(huì)出錯(cuò)。這些錯(cuò)誤可能是無(wú)害的,但是,往往不是這樣的,它們可能導(dǎo)致問(wèn)題。通過(guò)設(shè)置功能策略,使用戶與管理員互相配合,可以使個(gè)別的 cron 作業(yè)盡可能地不干擾其它的用戶和系統(tǒng)功能。

可以給為單個(gè)用戶或組分配的資源設(shè)置限制,但是,這是下一篇文章中的內(nèi)容。

 

更多信息,在 cron、crontab、anacron、anacrontab、和 run-parts 的 man 頁(yè)面上,所有的這些信息都描述了 cron 系統(tǒng)是如何工作的。 

責(zé)任編輯:龐桂玉 來(lái)源: Linux中國(guó)
相關(guān)推薦

2010-03-09 17:45:11

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

2017-06-09 13:17:04

Linuxcronanacron

2019-11-14 10:00:18

Linuxcron任務(wù)自動(dòng)化任務(wù)

2010-01-20 10:27:16

Linuxcrond命

2010-01-07 11:19:45

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

2017-03-27 08:30:00

Windows 8Windows計(jì)劃任務(wù)

2022-11-11 14:55:14

Linuxcron

2025-01-16 08:07:05

cron可視化管理器開(kāi)源

2010-01-07 11:10:00

cron配置計(jì)劃

2017-07-14 11:50:15

Windows 10Windows計(jì)劃任務(wù)

2010-11-15 09:10:43

CrontabLinux計(jì)劃任務(wù)

2019-05-29 08:00:00

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

2018-10-08 14:00:28

LinuxCron定時(shí)任務(wù)

2021-01-08 08:47:56

Saltstack架構(gòu)管理服務(wù)器

2024-11-06 10:59:00

2010-05-04 12:43:11

Oracle數(shù)據(jù)庫(kù)

2021-05-13 12:00:51

cron調(diào)度任務(wù)系統(tǒng)運(yùn)維

2022-04-19 09:03:22

Linuxcron命令

2023-10-06 12:15:02

2011-04-01 09:17:01

備份cactiwindows
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)