Linux講解之定時任務
本文目錄:
#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分鐘都執行該任務。
* * * * * /bin/cat >>/tmp/crond.txt %"the first %%cron entry%"
"the firstcron entry"
* * * * * cp /etc/fstab /tmp/`date +\%Y-\%m-\%d`.txt
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<=20;i++));dols /tmpsleep 3done
[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中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

熱門話題

恐怖走廊是模擬山羊3之中的一個任務,這個任務要怎麼樣才能夠去完成呢,掌握到詳細的過關方式和對應的流程,能夠完成這個任務的相應挑戰,下面就為大家帶來模擬山羊3恐怖走廊攻略,了解相關的資訊。模擬山羊3恐怖走廊攻略1、首先需要玩家前往地圖左上角的寂靜嶺處。 2.在這裡可以看到一個屋頂上寫著RESTSTOP的房子,玩家需要操作山羊進入這棟房子。 3.進入房間之後,我們先向前直走,然後向右轉,在這裡盡頭有一扇門,我們直接從這裡進去。 4.進入之後同樣是先向前走隨後右轉,在這裡走到門前門會關上,我們需要回頭找到

模擬山羊3是有著經典模擬玩法的遊戲,可讓玩家充分體驗到休閒動作類操作模擬的樂趣,遊戲中還擁有很多特色任務的精彩,其中模擬山羊3帝陵任務是需要玩家找尋到鐘塔上的三個鐘並操作的,有些玩家還不清楚要怎麼弄,下面帶來模擬山羊3帝陵任務攻略流程分享!模擬山羊3帝陵任務攻略流程按照順序敲擊鐘即可。詳細步驟拓展1、首先玩家需要打開地圖到霧丘公墓。 2.然後上到鐘樓上,裡面會有三個鐘。 3.接著按照從大到小的順序,依照222312312熟悉怒敲擊。 4、完成敲擊後即可完成任務,並打開大門以獲得光劍。

要自動化任務和管理多個系統,任務規劃軟體是您武器庫中的寶貴工具,尤其是對於系統管理員而言。 Windows任務規劃程式完美地完成了這項工作,但最近許多人報告說操作員拒絕了請求錯誤。這個問題存在於作業系統的所有迭代中,即使已經廣泛報告和涵蓋,也沒有有效的解決方案。繼續閱讀以找到真正對其他人有用的內容!操作員或管理員拒絕了任務計畫程式0x800710e0中的請求是什麼?任務計劃程式允許在沒有使用者輸入的情況下自動執行各種任務和應用程式。您可以使用它來安排和組織特定應用程式、配置自動通知、幫助傳遞訊息等。它

營救史蒂夫是模擬山羊3中的一個獨特任務,具體需要怎麼做才能夠完成呢,這個任務比較簡單,但是我們需要注意不要理解錯意思,下面就為大家帶來模擬山羊3營救史蒂夫任務攻略,能夠更好的完成相關的任務。模擬山羊3營救史蒂夫任務攻略1、先來到地圖中右下角的溫泉。 2.在來到溫泉邊之後就可以觸發營救史蒂夫的這個任務。 3.注意在溫泉裡有個男人,雖然他也叫史蒂夫,但是並不是這次任務的目標。 4.在這個溫泉裡找到一條叫史蒂夫的魚,並且將其帶上岸,即可完成這個任務。

抖音作為當下最受歡迎的社群媒體平台之一,吸引了大量用戶參與其中。在抖音上,有許多粉絲團任務可供用戶完成,以獲得一定的獎勵和福利。那麼,抖音粉絲團任務在哪裡可以找到呢?一、抖音粉絲團任務在哪裡看?為了找到抖音粉絲團任務,你需要造訪抖音的個人首頁。在主頁上,你會看到一個名為「粉絲團」的選項。點擊這個選項,你就可以瀏覽你所加入的粉絲團和相關任務。在粉絲團任務欄位中,你會看到各種不同類型的任務,例如按讚、留言、分享、轉發等。每個任務都有對應的獎勵和要求,一般來說,完成任務後會獲得一定數量的金幣或經驗值

如何在Windows11和Windows10中暫停工作管理員進程更新按CTRL+視窗鍵+刪除開啟工作管理員。預設情況下,任務管理器將開啟「進程」視窗。正如您在此處看到的,所有應用程式都在無休止地移動,當您想要選擇它們時,可能很難將它們指向下方。因此,按CTRL並按住它,這將暫停任務管理器。您仍然可以選擇應用程序,甚至可以向下捲動,但您必須始終按住CTRL按鈕。

實現任務通用是深度學習基礎模型研究的核心問題,也是近期大模型方向的主要關注點之一。然而,在時間序列領域,各類分析任務的差異較大,既有需要細粒度建模的預測任務,也有需要擷取高層語意資訊的分類任務。如何建構統一的深度基礎模型有效率地完成各類時序分析任務,此前尚未有成型方案。為此,來自清華大學軟體學院的團隊圍繞時序變化建模這一基本問題展開研究,提出了任務通用的時序基礎模型TimesNet,論文被ICLR 2023接收。作者列表:吳海旭*,胡騰戈*,劉雍*,週航,王建民,龍明盛連結:https://ope

凍結或無響應的程式很容易從任務管理器中殺死。但是Microsoft最近為使用者提供了直接從工作列終止這些任務的便利性。雖然該選項並未向所有人推出,但如果您有WindowsInsider版本,則很容易取得。以下是啟用「結束任務」按鈕並從工作列關閉任務所需的一切。如何從工作列中取得「結束工作」按鈕以殺死應用程式目前,為工作列應用啟用「結束工作」按鈕的選項僅作為具有Windows預覽體驗成員版本的使用者的開發人員選項提供。但是,這在即將推出的功能更新中可能會發生變化,因為它將在穩定版本上向全球用戶推出。如果您尚
