搜尋
首頁運維linux運維Linux怎麼定時執行任務

Linux怎麼定時執行任務

May 13, 2023 pm 07:01 PM
linux

    1 教學

    1.1 安裝crontabs

    yum install contabs  #通过yum安装
    systemctl enable crond  #设置开机启动
    systemctl start crond   #启动

    1.2 檢視crontab服務的狀態:

    service crond status

    Linux怎麼定時執行任務

    1.3 查看crontab的日誌資訊

    tail -f /var/log/cron  #crontab的日志信息放在/var/log文件夹中
    cat  /vat/log/cron

    Linux怎麼定時執行任務

    在crontab定時執行腳本的過程中,可能會有文件權限的問題,例如:

    Linux怎麼定時執行任務

    這個時候,需要給定時任務執行的腳本一個可執行的權限,修改權限的指令如下:

    chmod 777 /home/centos/sh/test.sh  #给所有权限

    1.4 設定定時任務

    crontab的定時任務檔案放在/etc/crontab檔案中,直接使用vim修改即可:

    Linux怎麼定時執行任務

    /etc/crontab檔案預設內容如下,其中也解釋了每個符號代表什麼意思:

    SHELL=/bin/bash
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    MAILTO=HOME=/
    # run-parts
    51 * * * * root run-parts /etc/cron.hourly
    24 7 * * * root run-parts /etc/cron.daily
    22 4 * * 0 root run-parts /etc/cron.weekly
    42 4 1 * * root run-parts /etc/cron.monthly

    前四行是用來設定crond任務運行的環境變量,第一行SHELL變數指定了系統要使用哪個shell,這裡是bash,第二行PATH變數指定了系統執行指令的路徑,第三行MAILTO變數指定了crond的任務執行資訊將透過電子郵件發送給root用戶,如果MAILTO變數的值為空,則表示不發送任務執行資訊給用戶,第四行的HOME變數指定了在執行命令或腳本時使用的主目錄。第六至九行所表示的含義將在下一個小節詳細講述。

    在以上各个字段中,还可以使用以下特殊字符:
    星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
    逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
    中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
    正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。
    文件:
    /etc/cron.deny
    说明:
    该文件中所列用户不允许使用crontab命令
    
    文件:
    /etc/cron.allow
    说明:
    该文件中所列用户允许使用crontab命令
    
    文件:
    /var/spool/cron/
    说明:
    所有用户crontab文件存放的目录,以用户名命名
    
    crontab文件的含义:
    用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:
    minute hour day month week command
    
    其中:
    minute: 表示分钟,可以是从0到59之间的任何整数。
    hour:表示小时,可以是从0到23之间的任何整数。
    day:表示日期,可以是从1到31之间的任何整数。
    month:表示月份,可以是从1到12之间的任何整数。
    week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。
    command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。

    Linux怎麼定時執行任務

    • 第一個位置:分鐘(0-59)

    • 第二個位置:小時(0-23)

    • 第三個位置:天(1-31)

    • 第四個位置:月(1- 12)

    • 第五個位置:星期(0-6)

    • 第六個位置:使用者名稱

    • #第七個位置:需要定時執行的腳本或命令

    (1)修改定時任務:
    crontab -e  #该命令等同于  vim /etc/crontab
    (2)查看定時任務
    crontab -l  #该命令等同于 cat /etc/crontab

    1.5 crontab指令詳解

    1.5.1 指令格式
    crontab [-u user] file
    crontab [-u user] [ -e | -l | -r ]
    1.5.2 指令功能

    透過crontab 指令,我們可以在固定的間隔時間執行指定的系統指令或shell script腳本。時間間隔的單位可以是分鐘、小時、日、月、週及以上的任意組合。這個指令非常設合週期性的日誌分析或資料備份等工作。

    1.5.3 指令參數
    • -u user:用來設定某個使用者的crontab服務,例如,「-u ixdba 」表示設定ixdba用戶的crontab服務,此參數一般有root用戶來執行。

    • file:file是指令檔的名字,表示將file做為crontab的任務清單檔案並載入crontab。如果在命令列中沒有指定這個文件,crontab指令將接受標準輸入(鍵盤)上鍵入的命令,並將它們載入crontab。

    • -e:編輯某個使用者的crontab檔案內容。如果不指定用戶,則表示編輯目前用戶的crontab檔案。

    • -l:顯示某個用戶的crontab檔案內容,如果不指定用戶,則表示顯示目前用戶的crontab檔案內容。

    • -r:從/var/spool/cron目錄中刪除某個用戶的crontab文件,如果不指定用戶,則預設刪除目前用戶的crontab文件。

    • -i:在刪除使用者的crontab檔案時給予確認提示。

    1.5.4 常用方法

    建立一個新的crontab檔案

    在考慮向cron行程提交一個crontab檔案之前,首先要做的一件事情就是設定環境變數EDITOR。 cron程序根據它來決定要使用哪個編輯器來編輯 crontab檔。 99%的UNIX和LINUX使用者都使用vi,如果你也是這樣,那麼你就編輯$ HOME目錄下的.profile文件,在其 中加入這樣一行:

    EDITOR=vi; export EDITOR

    然後儲存並退出。不妨建立一個名為cron的文件,其中是用戶名,例如, davecron。在該文件中加入如下的內容。

    # (put your own initials here)echo the date to the console every
    # 15minutes between 6pm and 6am
    0,15,30,45 18-06 * /bin/echo ‘date' > /dev/console

    儲存並退出。確信前面5個域用空格分隔。

    在 上面的範例中,系統將每隔15分鐘向控制台輸出一次目前時間。如果系統崩潰或掛起,從最後顯示的時間就可以一眼看出系統是什麼時間停止運作的。在有些 系統中,用tty1來表示控制台,可以根據實際情況對上面的例子做相應的修改。為了提交你剛剛建立的crontab文件,可以把這個新建立的文件當作cron指令的參數:

    $ crontab davecron
    • 现在该文件已经提交给cron进程,它将每隔15分钟运行一次。

      同时,新创建文件的一个副本已经被放在/var/spool/cron目录中,文件名就是用户名(即dave)。

    • 列出crontab文件

      为了列出crontab文件,可以用:

    $ crontab -l
    0,15,30,45,18-06 * * * /bin/echo`date`> dev/tty1

    你将会看到和上面类似的内容。可以使用这种方法在$ H O M E目录中对crontab文件做一备份:

    $ crontab -l > $HOME/mycron
    • 这样,一旦不小心误删了crontab文件,可以用上一节所讲述的方法迅速恢复。

    • 编辑crontab文件

      如果希望添加、删除或编辑crontab文件中的条目,而E D I TO R环境变量又设置为vi,那么就可以用vi来编辑crontab文件,相应的命令为:

    $ crontab -e

    可以像使用v i编辑其他任何文件那样修改crontab文件并退出。如果修改了某些条目或添加了新的条目,那么在保存该文件时, cron会对其进行必要的完整性检查。如果其中的某个域出现了超出允许范围的值,它会提示你。

    我们在编辑crontab文件时,没准会加入新的条目。例如,加入下面的一条:

    # DT:delete core files,at 3.30am on 1,7,14,21,26,26 days of each month
    30 3 1,7,14,21,26 /bin/find -name “core' -exec rm {} \;

    现在保存并退出。最好在crontab文件的每一个条目之上加入一条注释,这样就可以知道它的功能、运行时间,更为重要的是,知道这是哪位用户的作业。

    现在让我们使用前面讲过的crontab -l命令列出它的全部信息:

    $ crontab -l
    # (crondave installed on Tue May 4 13:07:43 1999)
    # DT:ech the date to the console every 30 minites
    0,15,30,45 18-06 * * * /bin/echo`date`> /dev/tty1
    # DT:delete core files,at 3.30am on 1,7,14,21,26,26 days of each month
    30 3 1,7,14,21,26 * * /bin/find -name “core' -exec rm {} \;

    删除crontab文件

    要删除crontab文件,可以用:

    $ crontab -r

    恢复丢失的crontab文件

    如果不小心误删了crontab文件,假设你在自己的$HOME目录下还有一个备份,那么可以将其拷贝到/var/spool/cron/,其中是用户名。如果由于权限问题无法完成拷贝,可以用:

    $ crontab

    其中,是你在$HOME目录中副本的文件名。

    我建议你在自己的$HOME目录中保存一个该文件的副本。我就有过类似的经历,有数次误删了crontab文件(因为r键紧挨在e键的右边)。这就是为什么有些系统文档建议不要直接编辑crontab文件,而是编辑该文件的一个副本,然后重新提交新的文件。

    有些crontab的变体有些怪异,所以在使用crontab命令时要格外小心。如果遗漏了任何选项,crontab可能会打开一个空文件,或者看起来像是个空文件。这时敲delete键退出,不要按,否则你将丢失crontab文件。

    2 案例

    (1)每5秒执行一次任务

    */1 * * * * /bin/date >>/tmp/date.txt
    */1 * * * * sleep 5  && /bin/date >>/tmp/date.txt
    */1 * * * * sleep 10 && /bin/date >>/tmp/date.txt
    */1 * * * * sleep 15 && /bin/date >>/tmp/date.txt
    */1 * * * * sleep 20 && /bin/date >>/tmp/date.txt
    */1 * * * * sleep 25 && /bin/date >>/tmp/date.txt
    */1 * * * * sleep 30 && /bin/date >>/tmp/date.txt
    */1 * * * * sleep 35 && /bin/date >>/tmp/date.txt
    */1 * * * * sleep 40 && /bin/date >>/tmp/date.txt
    */1 * * * * sleep 45 && /bin/date >>/tmp/date.txt
    */1 * * * * sleep 50 && /bin/date >>/tmp/date.txt
    */1 * * * * sleep 55 && /bin/date >>/tmp/date.txt

    (2)更多案例

    实例1:每1分钟执行一次command
    命令:
    * * * * * command
    
    实例2:每小时的第3和第15分钟执行
    命令:
    3,15 * * * * command
    
    实例3:在上午8点到11点的第3和第15分钟执行
    命令:
    3,15 8-11 * * * command
    
    实例4:每隔两天的上午8点到11点的第3和第15分钟执行
    命令:
    3,15 8-11 */2 * * command
    
    实例5:每个星期一的上午8点到11点的第3和第15分钟执行
    命令:
    3,15 8-11 * * 1 command
    
    实例6:每晚的21:30重启smb
    命令:
    30 21 * * * /etc/init.d/smb restart
    
    实例7:每月1、10、22日的4 : 45重启smb
    命令:
    45 4 1,10,22 * * /etc/init.d/smb restart
    
    实例8:每周六、周日的1 : 10重启smb
    命令:
    10 1 * * 6,0 /etc/init.d/smb restart
    
    实例9:每天18 : 00至23 : 00之间每隔30分钟重启smb
    命令:
    0,30 18-23 * * * /etc/init.d/smb restart
    
    实例10:每星期六的晚上11 : 00 pm重启smb
    命令:
    0 23 * * 6 /etc/init.d/smb restart
    
    实例11:每一小时重启smb
    命令:
    * */1 * * * /etc/init.d/smb restart
    
    实例12:晚上11点到早上7点之间,每隔一小时重启smb
    命令:
    * 23-7/1 * * * /etc/init.d/smb restart
    
    实例13:每月的4号与每周一到周三的11点重启smb
    命令:
    0 11 4 * mon-wed /etc/init.d/smb restart
    
    实例14:一月一号的4点重启smb
    命令:
    0 4 1 jan * /etc/init.d/smb restart
    
    实例15:每小时执行/etc/cron.hourly目录内的脚本
    命令:
    01 * * * * root run-parts /etc/cron.hourly
    说明:
    run-parts这个参数了,如果去掉这个参数的话,后面就可以写要运行的某个脚本名,而不是目录名了

    (3) 使用注意

    注意环境变量问题
    有时我们创建了一个crontab,但是这个任务却无法自动执行,而手动执行这个任务却没有问题,这种情况一般是由于在crontab文件中没有配置环境变量引起的。

    在 crontab文件中定义多个调度任务时,需要特别注意的一个问题就是环境变量的设置,因为我们手动执行某个任务时,是在当前shell环境下进行的,程 序当然能找到环境变量,而系统自动执行任务调度时,是不会加载任何环境变量的,因此,就需要在crontab文件中指定任务运行所需的所有环境变量,这 样,系统执行任务调度时就没有问题了。

    不要假定cron知道所需要的特殊环境,它其实并不知道。所以你要保证在shelll脚本中提供所有必要的路径和环境变量,除了一些自动设置的全局变量。所以注意如下3点:

    脚本中涉及文件路径时写全局路径;

    脚本执行要用到java或其他环境变量时,通过source命令引入环境变量,如:

    cat start_cbp.sh
    #!/bin/sh
    source /etc/profile
    export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf
    /usr/local/jboss-4.0.5/bin/run.sh -c mev &
    • 当手动执行脚本OK,但是crontab死活不执行时。这时必须大胆怀疑是环境变量惹的祸,并可以尝试在crontab中直接引入环境变量解决问题。如:

    0 . /etc/profile;/bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh

    注意清理系统用户的邮件日志
    每条任务调度执行完毕,系统都会将任务输出信息通过电子邮件的形式发送给当前系统用户,这样日积月累,日志信息会非常大,可能会影响系统的正常运行,因此,将每条任务进行重定向处理非常重要。

    例如,可以在crontab文件中设置如下形式,忽略日志输出:

    0 */3* /usr/local/apache2/apachectl restart >/dev/null 2>&1

    /dev/null 2>&1表示先将标准输出重定向到/dev/null,然后将标准错误重定向到标准输出,由于标准输出已经重定向到了/dev/null,因此标准错误也会重定向到/dev/null,这样日志输出问题就解决了。

    系統級任務排程與使用者級任務排程
    系統級任務排程主要完成系統的一些維護操作,使用者級任務排程主要完成使用者自訂的一些任務,可以將使用者級任務排程放到系統級任務調度來完成(不建議這麼做),但是反過來卻不行,root用戶的任務調度操作可以透過crontab –uroot –e來設置,也可以將調度任務直接寫入/etc /crontab文件,需要注意的是,如果要定義一個定時重啟系統的任務,就必須將任務放到/etc/crontab文件,即使在root用戶下創建一個定時重新啟動系統的任務也是無效的。

    其他注意事項
    新建立的cron job,不會馬上執行,至少要過2分鐘才執行。如果重啟cron則馬上執行。

    當crontab突然失效時,可以嘗試/etc/init.d/crond restart解決問題。或是查看日誌看某個job有沒有執行/報錯tail -f /var/log/cron

    千萬別亂運行crontab -r。它從Crontab目錄(/var/spool/cron)中刪除使用者的Crontab檔案。刪除了該用戶的所有crontab都沒了。

    在crontab中%是有特殊意義的,表示換行的意思。如果要用的話必須進行轉義\%,如常用的date ' %Y%m%d'在crontab裡是不會執行的,應該換成date ' \%Y \%m\%d'

    以上是Linux怎麼定時執行任務的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    陳述
    本文轉載於:亿速云。如有侵權,請聯絡admin@php.cn刪除
    了解Linux:定義的核心組件了解Linux:定義的核心組件May 01, 2025 am 12:19 AM

    Linux的核心組件包括內核、shell、文件系統、進程管理和內存管理。 1)內核管理系統資源,2)shell提供用戶交互界面,3)文件系統支持多種格式,4)進程管理通過fork等系統調用實現,5)內存管理使用虛擬內存技術。

    Linux的構建塊:關鍵組件解釋了Linux的構建塊:關鍵組件解釋了Apr 30, 2025 am 12:26 AM

    Linux系統的核心組成部分包括內核、文件系統和用戶空間。 1.內核管理硬件資源並提供基本服務。 2.文件系統負責數據存儲和組織。 3.用戶空間運行用戶程序和服務。

    使用維護模式:故障排除和修復Linux使用維護模式:故障排除和修復LinuxApr 29, 2025 am 12:28 AM

    維護模式是Linux系統中通過單用戶模式或救援模式進入的特殊運行級別,用於系統維護和修復。 1.進入維護模式使用命令“sudosystemctlisolaterescue.target”。 2.在維護模式中,可以檢查並修復文件系統,使用命令“fsck/dev/sda1”。 3.高級用法包括重置root用戶密碼,需掛載文件系統為讀寫模式並編輯密碼文件。

    Linux維護模式:了解目的Linux維護模式:了解目的Apr 28, 2025 am 12:01 AM

    維護模式用於系統維護和修復,允許管理員在簡化環境中工作。 1.系統修復:修復損壞的文件系統和啟動加載器。 2.密碼重置:重置root用戶密碼。 3.軟件包管理:安裝、更新或刪除軟件包。通過修改GRUB配置或使用特定鍵進入維護模式,執行維護任務後可安全退出。

    Linux操作:網絡和網絡配置Linux操作:網絡和網絡配置Apr 27, 2025 am 12:09 AM

    Linux網絡配置可以通過以下步驟完成:1.配置網絡接口,使用ip命令臨時設置或編輯配置文件持久化設置。 2.設置靜態IP,適合需要固定IP的設備。 3.管理防火牆,使用iptables或firewalld工具來控製網絡流量。

    Linux中的維護模式:系統管理員指南Linux中的維護模式:系統管理員指南Apr 26, 2025 am 12:20 AM

    維護模式在Linux系統管理中扮演關鍵角色,幫助進行系統修復、升級和配置變更。 1.進入維護模式可以通過GRUB菜單選擇或使用命令“sudosystemctlisolaterescue.target”。 2.在維護模式下,可以執行文件系統修復和系統更新等操作。 3.高級用法包括重置root密碼等任務。 4.常見錯誤如無法進入維護模式或掛載文件系統,可通過檢查GRUB配置和使用fsck命令修復。

    Linux中的維護模式:何時以及為什麼使用它Linux中的維護模式:何時以及為什麼使用它Apr 25, 2025 am 12:15 AM

    使用Linux維護模式的時機和原因:1)系統啟動問題時,2)進行重大系統更新或升級時,3)執行文件系統維護時。維護模式提供安全、控制的環境,確保操作的安全性和效率,減少對用戶的影響,並增強系統的安全性。

    Linux:基本命令和操作Linux:基本命令和操作Apr 24, 2025 am 12:20 AM

    Linux中不可或缺的命令包括:1.ls:列出目錄內容;2.cd:改變工作目錄;3.mkdir:創建新目錄;4.rm:刪除文件或目錄;5.cp:複製文件或目錄;6.mv:移動或重命名文件或目錄。這些命令通過與內核交互執行操作,幫助用戶高效管理文件和系統。

    See all articles

    熱AI工具

    Undresser.AI Undress

    Undresser.AI Undress

    人工智慧驅動的應用程序,用於創建逼真的裸體照片

    AI Clothes Remover

    AI Clothes Remover

    用於從照片中去除衣服的線上人工智慧工具。

    Undress AI Tool

    Undress AI Tool

    免費脫衣圖片

    Clothoff.io

    Clothoff.io

    AI脫衣器

    Video Face Swap

    Video Face Swap

    使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

    熱工具

    SublimeText3 Mac版

    SublimeText3 Mac版

    神級程式碼編輯軟體(SublimeText3)

    Dreamweaver CS6

    Dreamweaver CS6

    視覺化網頁開發工具

    EditPlus 中文破解版

    EditPlus 中文破解版

    體積小,語法高亮,不支援程式碼提示功能

    WebStorm Mac版

    WebStorm Mac版

    好用的JavaScript開發工具

    ZendStudio 13.5.1 Mac

    ZendStudio 13.5.1 Mac

    強大的PHP整合開發環境