搜尋
首頁運維linux運維Linux講解之定時任務

Linux講解之定時任務

May 14, 2018 am 10:11 AM
任務定時


本文目錄:

#12.1 設定定時任務

##12.2 crontab file

#12.3 crond指令的偵錯

12.4 精確到秒的任務計畫

12.1 設定定時任務

首先需弄清楚的概念:

##(1).crond是一個daemon類別程序,路徑為/usr/sbin/crond。預設會以後台方式啟動,service或systemd方式啟動crond預設也是後台方式的。

(2).crondtab是管理crontab file的工具,而crontab file是定義定時任務條目的檔案。

(3).crontab file存在於多處,包括系統定時任務檔案/etc/crontab和/etc/cron.d/*,還有獨屬於各使用者的任務檔案/var/spool/ cron/USERNAME。

再就是crontab指令:

-l:列出定时任务条目
-r:删除当前任务列表终端所有任务条目
-i:删除条目时提示是否真的要删除
-e:编辑定时任务文件,实际上编辑的是/var/spool/cron/*文件
-u:操作指定用户的定时任务

#執行crontab -e指令編輯目前使用者的crontab file,例如目前為root用戶,則編輯的是/var/spool/cron/root檔案。例如寫入下面這一行。

* * * * * /bin/echo "the first cron entry"  >>/tmp/crond.txt

這將會每分鐘執行一次echo指令,將內容追加到/tmp/crond.txt檔案中。

任務計畫中的任務項目如何定義,可以檢視/etc/crontab檔案。

[root@server2 ~]# cat /etc/crontab
SHELL=/bin/bashPATH=/sbin:/bin:/usr/sbin:/usr/binMAILTO=root
 
# For details see man 4 crontabs
 
# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |# *  *  *  *  * user-name  command to be executed

在此檔案中定義了3個變量,其中一個是PATH,極為重要。最後也給了任務條目的定義方式:

(1).每個任務條目分為6段,每段以空格分隔,之所以此處多了user-name段是因為/ etc/crontab為系統定時任務文件,而一般定時任務是沒有該段的。

(2).前五段為時間的設定段,分別表示"分時日月週",它們的定義不能超出合理值範圍,第六段為所要執行的命令或腳本任務段。

(3).在時間定義段中,使用"*"表示每單位,即每分鐘,每小時,每天,每月,每週幾(仍然是每天)。 (4).每個時間段中,都可以使用逗號","來表示枚舉,例如定義"0,30,50 * * * *"表示每個時辰的整點、第30分鐘和第50分鐘都執行該任務。

(5).每個時間段中,都可以使用"-"定義範圍,可以結合逗號使用。如分鐘段定義了"00,20-30,50"表示每個時辰的整點、第20到30分鐘的每分鐘、第50分鐘都執行該任務。

(6).每個時間段中,使用"/"表示忽略時間,如在小時段定義了"0-13/2"表示在"0/2/4/6/8/ 10/12"點才滿足時間定義。常使用"*/N"表示每隔多久的意思。例如"00 */2 * * *"表示在每天每隔兩小時的整點執行該任務。 ######(7).如果定義的日和週衝突了,則會多次執行(不包括因為*號導致的衝突)。例如每月的15號執行該任務,同時又定義了周三執行該任務,正常無衝突情況下,將在周三和每月15號執行,但如果某月的15號同時是周三,則該任務在此日執行兩次。因此,應盡力避免同時定義周和日的任務。 #########(8).命令段(即第6段)中,不能隨意出現百分號"%",因為它表示換行的特殊意義,且第一個%後的所有字符串將當作命令的標準輸入。 #########例如下面的定義:#########
* * * * * /bin/cat >>/tmp/crond.txt %"the first %%cron entry%"
##########該任務輸出的結果將是:#########
"the firstcron entry"
#########所以,在定時任務項目中若以時間定義檔名時,應將%使用反斜線轉義。如:#########
* * * * * cp /etc/fstab /tmp/`date +\%Y-\%m-\%d`.txt
############另外一個需要注意的時間段設定是,使用*號導致低等級的時間覆蓋高等級的時間。例如"* */2 * * *",它不表示每兩小時執行一次任務,而是每分鐘執行一次,儘管在小時位上設定了每隔兩小時,但在分鐘位上設定的是每分鐘,所以它仍然表示每分鐘執行一次任務。同理,"*/5 */2 * * *"分鐘位上的設置覆蓋小時位上的設置,表示每5分鐘執行一次而忽略小時位的設置;"00 */2 */5 * *"表示每隔兩小時的整點執行一次任務而忽略天數位的設定。 ################

12.2 crondtab file

crondtab file为任务定义文件。

(1).在此文件中,空行会被忽略,首个非空白字符且以#开头的行为注释行,但#不能出现在行中。

(2).可以在crontab file中设置环境变量,方式为"name=value",等号两边的空格可随意,即"name = value"也是允许的。但value中出现的空格必须使用引号包围。

(3). 默认crond命令启动的时候会初始化所有变量,除了某几个变量会被crond daemon自动设置好,其他所有变量都被设置为空值。自动设置的变量包括SHELL=/bin/sh,以及HOME和LOGNAME(在CentOS上则称为USER),后两者将被默认设置为/etc/passwd中指定的值。其中SHELL和HOME可以被crontab file中自定义的变量覆盖,但LOGNAME不允许覆盖。当然,自行定义的变量也会被加载到内存。

(4).除了LOGNAME/HOME/SHELL变量之外,如果设置了发送邮件,则crond还会寻找MAILTO变量。如果设置了MAILTO,则邮件将发送给此变量指定的地址,如果MAILTO定义的值为空(MAILTO=""),将不发送邮件,其他所有情况邮件都会发送给crontab file的所有者。

(5).在系统定时任务文件/etc/crontab中,默认已定义PATH环境变量和SHELL环境变量,其中PATH=/sbin:/bin:/usr/sbin:/usr/bin。

(6).crond daemon每分钟检测一次crontab file看是否有任务计划条目需要执行。

12.3 crond命令的调试

很多时候写了定时任务却发现没有执行,或者执行失败,但因为crond是后台运行的,有没有任何提示,很难进行排错。但是可以让crond运行在前端并进行调试的。

先说明下任务计划程序crond的默认执行方式。

使用下面三条命令启动的crond都是在后台运行的,且都不依赖于终端。

[root@xuexi ~]# systemctl start crond.service
[root@xuexi ~]# service crond start
[root@xuexi ~]# crond

但crond是允许接受选项的。

crond [-n] [-P] [-x flags]
选项说明:-n:让crond以前端方式运行,即不依赖于终端。-P:不重设环境变量PATH,而是从父进程中继承。-x:设置调试项,flags是调试方式,比较有用的方式是test和sch,即"-x test"和"-x sch"。
  :其中test调试将不会真正的执行,sch调试将可以看到等待时间。具体的见下面的示例。

先看看启动脚本启动crond的方式。

[root@server2 ~]# cat /lib/systemd/system/crond.service
[Unit]
Description=Command Scheduler
After=auditd.service systemd-user-sessions.service time-sync.target
 
[Service]EnvironmentFile=/etc/sysconfig/crond
ExecStart=/usr/sbin/crond -n $CRONDARGSExecReload=/bin/kill -HUP $MAINPID
KillMode=process

[Install]
WantedBy=multi-user.target

它的环境配置文件为/etc/sysconfig/crond,该文件中什么也没设置。

[root@server2 ~]# cat /etc/sysconfig/crond
# Settings for the CRON daemon.
# CRONDARGS= :  any extra command-line startup arguments for crond
CRONDARGS=

所有它的启动命令为:/usr/sbin/crond -n。但尽管此处加了"-n"选项,crond也不会前端运行,且不会依赖于终端,这是systemctl决定的。

在解释下如何进行调试。以下面的任务条目为例。

[root@server2 ~]# crontab -e* * * * * echo "hello world" >>/tmp/hello.txt

执行crond并带上调试选项test。

[root@server2 ~]# crond -x test
debug flags enabled: test
[4903] cron started
log_it: (CRON 4903) INFO (RANDOM_DELAY will be scaled with factor 8% if used.)
log_it: (CRON 4903) INFO (running with inotify support)
log_it: (CRON 4903) INFO (@reboot jobs will be run at computer's startup.)log_it: (root 4905) CMD (echo "hello world" >>/tmp/hello.txt )

执行crond并带上调试选项sch。

[root@server2 ~]# crond -x sch
debug flags enabled: sch
[4829] cron started
log_it: (CRON 4829) INFO (RANDOM_DELAY will be scaled with factor 73% if used.)
log_it: (CRON 4829) INFO (running with inotify support)
[4829] GMToff=28800log_it: (CRON 4829) INFO (@reboot jobs will be run at computer's startup.)[4829] Target time=1497950880, sec-to-wait=38      # 等待crond daemon下一次的检测,所以表示38秒后crond将检测crontab file
user [root:0:0:...] cmd="echo "hello world" >>/tmp/hello.txt "
[4829] Target time=1497950940, sec-to-wait=60Minute-ly job. Recording time 1497922081log_it: (root 4831) CMD (echo "hello world" >>/tmp/hello.txt )user [root:0:0:...] cmd="echo "hello world" >>/tmp/hello.txt "[4829] Target time=1497951000, sec-to-wait=60Minute-ly job. Recording time 1497922141log_it: (root 4833) CMD (echo "hello world" >>/tmp/hello.txt )

但要注意,在sch调试结果中的等待时间是crond这个daemon的检测时间,所以它表示等待下一次检测的时间,因此除了第一次,之后每次都是60秒,因为默认crond是每分钟检测一次crontab file的。例如,下面是某次的等待结果,在这几次等待检测过程中没有执行任何任务。

[4937] Target time=1497951720, sec-to-wait=18[4937] Target time=1497951780, sec-to-wait=60[4937] Target time=1497951840, sec-to-wait=60

还可以同时带多个调试方式,如:

[root@server2 ~]# crond -x test,schdebug flags enabled: sch test[4914] cron started
log_it: (CRON 4914) INFO (RANDOM_DELAY will be scaled with factor 21% if used.)
log_it: (CRON 4914) INFO (running with inotify support)
[4914] GMToff=28800log_it: (CRON 4914) INFO (@reboot jobs will be run at computer's startup.)[4914] Target time=1497951540, sec-to-wait=9
user [root:0:0:...] cmd="echo "hello world" >>/tmp/hello.txt "
[4914] Target time=1497951600, sec-to-wait=60Minute-ly job. Recording time 1497922741log_it: (root 4916) CMD (echo "hello world" >>/tmp/hello.txt )

这样在调试定时任务时间时,也不会真正执行命令。

12.4 精确到秒的任务计划

默认情况下,crond执行的任务只能精确到分钟,无法精确到秒。但通过技巧,也是能实现秒级任务的。

(1).方法一:不太精确的方法

写一个脚本,在脚本中sleep3秒钟的时间,这样能实现每3秒执行一次命令。

[root@xuexi ~]# cat /tmp/a.sh#!/bin/bash
#
PATH="$PATH:/usr/local/bin:/usr/local/sbin"for ((i=1;i<p class="cnblogs_code"></p><pre class="brush:php;toolbar:false">[root@xuexi ~]# cat /var/spool/cron/lisi* * * * * /bin/bash /tmp/a.sh

但是这样的方法不是最佳方法,因为执行命令也需要时间,且crond默认会有一个随机延时,随机延时由变量RANDOM_DELAY定义。

(2).方法二:在cron配置文件中写入多条sleep命令和其他命令。

[root@xuexi ~]# cat /var/spool/cron/lisi* * * * * ls /tmp* * * * * sleep 3 && ls /tmp* * * * * sleep 6 && ls /tmp* * * * * sleep 9 && ls /tmp* * * * * sleep 12 && ls /tmp* * * * * sleep 15 && ls /tmp* * * * * sleep 18 && ls /tmp* * * * * sleep 21 && ls /tmp* * * * * sleep 24 && ls /tmp* * * * * sleep 27 && ls /tmp* * * * * sleep 30 && ls /tmp
…* * * * * sleep 57 && ls /tmp

这种方式很繁琐,但是更精确。如果定义到每秒级别就得写60行cron记录。

由此能看出,秒级的任务本就不是crond所擅长的。实际上能用到秒级的任务也比较少。

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

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
Linux的心臟:5個核心組件Linux的心臟:5個核心組件Apr 13, 2025 am 12:15 AM

Linux的5個核心組件分別是內核、Shell、文件系統、系統庫和系統工具。 1.內核管理硬件資源並為應用程序提供服務。 2.Shell作為用戶與系統的接口,解釋並執行命令。 3.文件系統負責數據的存儲和組織。 4.系統庫提供預編譯函數供應用程序調用。 5.系統工具用於系統管理和維護。這些組件協同工作,賦予Linux強大的功能和靈活性。

如何檢查Debian OpenSSL配置如何檢查Debian OpenSSL配置Apr 12, 2025 pm 11:57 PM

本文介紹幾種檢查Debian系統OpenSSL配置的方法,助您快速掌握系統安全狀態。一、確認OpenSSL版本首先,驗證OpenSSL是否已安裝及版本信息。在終端輸入以下命令:opensslversion若未安裝,系統將提示錯誤。二、查看配置文件OpenSSL主配置文件通常位於/etc/ssl/openssl.cnf。您可以使用文本編輯器(例如nano)查看:sudonano/etc/ssl/openssl.cnf此文件包含密鑰、證書路徑及加密算法等重要配置信息。三、利用ope

Debian上Hadoop開發環境如何搭建Debian上Hadoop開發環境如何搭建Apr 12, 2025 pm 11:54 PM

本指南詳細介紹如何在Debian系統上搭建Hadoop開發環境。一、安裝Java開發套件(JDK)首先,安裝OpenJDK:sudoaptupdatesudoaptinstallopenjdk-11-jdk-y配置JAVA_HOME環境變量:sudonano/etc/environment在文件末尾添加(根據實際JDK版本調整路徑):JAVA_HOME="/usr/lib/jvm/java-11-openjdk-amd64"保存並退出,然後執行:source/etc

Debian上Hadoop資源管理怎麼做Debian上Hadoop資源管理怎麼做Apr 12, 2025 pm 11:51 PM

在Debian系統上有效管理Hadoop資源,需要遵循以下步驟:Hadoop部署:首先,在Debian系統上完成Hadoop的安裝與配置。這包括下載Hadoop發行包、解壓、設置環境變量等必要操作。集群配置:安裝完成後,對Hadoop集群進行配置,涵蓋HDFS(Hadoop分佈式文件系統)和YARN(YetAnotherResourceNegotiator)的設置。需要修改核心配置文件,例如:core-site.xml、hdfs-site.xml、mapred-site.x

Debian Tomcat日誌安全設置有哪些Debian Tomcat日誌安全設置有哪些Apr 12, 2025 pm 11:48 PM

提升DebianTomcat日誌安全性,需關注以下關鍵策略:一、權限控制與文件管理:日誌文件權限:默認日誌文件權限(640)限制了訪問,建議修改catalina.sh腳本中的UMASK值(例如,從0027改為0022),或在log4j2配置文件中直接設置filePermissions,以確保合適的讀寫權限。日誌文件位置:Tomcat日誌通常位於/opt/tomcat/logs(或類似路徑),需定期檢查該目錄的權限設置。二、日誌輪轉與格式:日誌輪轉:配置server.xml

如何解讀Tomcat日誌中的警告如何解讀Tomcat日誌中的警告Apr 12, 2025 pm 11:45 PM

Tomcat服務器日誌中的警告信息提示潛在問題,可能影響應用性能或穩定性。有效解讀這些警告信息需要關注以下幾個關鍵點:警告內容:仔細研讀警告信息,明確問題類型、成因及可能的解決方法。警告信息通常會提供詳細描述。日誌級別:Tomcat日誌包含不同級別信息,例如INFO、WARN、ERROR等。 “WARN”級別的警告提示非致命性問題,但需要關注。時間戳:記錄警告發生的時間,以便追溯問題出現的時間點,分析其與特定事件或操作的關係。上下文信息:查看警告信息前後日誌內容,獲取

Tomcat日誌如何幫助排查內存洩漏Tomcat日誌如何幫助排查內存洩漏Apr 12, 2025 pm 11:42 PM

Tomcat日誌是診斷內存洩漏問題的關鍵。通過分析Tomcat日誌,您可以深入了解內存使用情況和垃圾回收(GC)行為,從而有效定位和解決內存洩漏。以下是如何利用Tomcat日誌排查內存洩漏:1.GC日誌分析首先,啟用詳細的GC日誌記錄。在Tomcat啟動參數中添加以下JVM選項:-XX: PrintGCDetails-XX: PrintGCDateStamps-Xloggc:gc.log這些參數會生成詳細的GC日誌(gc.log),包含GC類型、回收對像大小和時間等信息。分析gc.log

Debian Apache日誌對服務器性能有何影響Debian Apache日誌對服務器性能有何影響Apr 12, 2025 pm 11:39 PM

Debian系統下Apache日誌對服務器性能的影響是雙刃劍,既有積極作用,也有潛在的負面影響。積極方面:問題診斷利器:Apache日誌詳細記錄服務器所有請求和響應,是快速定位故障的寶貴資源。通過分析錯誤日誌,可以輕鬆識別配置錯誤、權限問題及其他異常。安全監控哨兵:訪問日誌能夠追踪潛在安全威脅,例如惡意攻擊嘗試。通過設置日誌審計規則,可以有效檢測異常活動。性能分析助手:訪問日誌記錄請求頻率和資源消耗,幫助分析哪些頁面或服務最受歡迎,從而優化資源分配。結合top或htop等

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脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。