搜尋
首頁系統教程Linux關於 Linux 下的 crontab,那些你不知道的知識點

關於 Linux 下的 crontab,那些你不知道的知識點

Feb 14, 2024 pm 01:10 PM
linuxlinux教程linux系統linux指令shell腳本系統安裝overflow嵌入式linuxlinux入門linux學習

在實際工作中,crontab可能會出現各種問題。以下我們將深入探討crontab在具體工作中容易出現的問題以及解決這些問題的方法。

一、crontab的功能

crond是一個守護進程,用於在Linux下週期性地執行任務或等待處理某些事件。它類似Windows下的排程任務。當作業系統安裝完成後,預設會安裝此服務工具,並自動啟動crond進程。 crond程序每分鐘會定期檢查是否有要執行的任務,如果有,則自動執行該任務。

Linux下的任務調度分為兩類:系統任務調度和使用者任務調度。

  • 系統任務排程:系統週期性要執行的工作,例如將快取資料寫入硬碟、清理日誌等。
  • 使用者任務排程:使用者定期要執行的工作,例如使用者資料備份、定時郵件提醒等。使用者可以使用 crontab 工具來自訂自己的排程任務。所有使用者定義的 crontab 檔案都保存在 /var/spool/cron 目錄中,檔案名稱與使用者名稱相同。

crontab 在企業實際應用中非常廣泛,常見用途包括定時資料備份、定時系統偵測、定時資料收集、定時更新設定、定時產生報表等。

二、crontab應用實例

1、crontab使用格式

crontab常用的使用格式有下列兩種:

crontab [-u user] [file]
crontab [-u user] [-e|-l|-r |-i]

選項意義如下:

  • -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檔案時給予確認提示。

2、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:要執行的指令,可以是系統指令,也可以是自己寫的腳本檔。

#在以上各個欄位中,也可以使用以下特殊字元:

? 星号():代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。

? 逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”

? 中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”

? 正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如/10,如果用在minute字段,表示每十分钟执行一次。

3、几个crontab例子

0 /3 /usr/local/apache2/apachectl restart

表示每隔3个小时重启apache服务一次。

30 3 6 /webdata/bin/backup.sh

表示每周六的3点30分执行/webdata/bin/backup.sh脚本的操作。

0 0 1,20 fsck /dev/sdb8

表示每个月的1号和20号检查/dev/sdb8磁盘设备。

10 5 /5 * echo "">/usr/local/apache2/log/access_log

表示每个月的5号、10号、15号、20号、25号、30号的5点10分执行清理apache日志操作。

三、系统级任务调度/etc/crontab

在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。

/etc/crontab文件包括下面几行:

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

从上面的示例文件可看出,crontab的任务列表主要由两部分组成:环境变量配置与定时任务配置。可能大家在工作中更多是只用到了任务配置部分。

前四行是用来配置crond任务运行的环境变量,第一行SHELL变量指定了系统要使用哪个shell,这里是bash,第二行PATH变量指定了系统执行命令的路径,第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户,第四行的HOME变量指定了在执行命令或者脚本时使用的主目录。第六至九行就是crontab执行格式的具体写法。

四、crontab调试解析神器

通常在使用crontab添加任务时,我们会依靠自己已有知识编写定时语句。当需要测试语句是否正确时,还需要在服务器上不断调试,,这种方式太不高效了。有没有一款工具,只要我们给出语句,就能告诉具体执行时间以及对错呢?还真有,下面介绍一款老外开发的crontab在线解析工具。

工具地址:https://crontab.guru

给出这个工具的截图如下:

关于 Linux 下的 crontab,你不知道的那些知识点

好用不好用,你试试就知道。

五、crontab使用的各种坑

1、环境变量问题

当我们刚使用crontab时,运维老鸟们一般会告知所有命令尽量都使用绝对路径,以防错误。这是为什么?这就和我们下面要谈的环境变量有关了。

首先,获取shell终端环境变量,内容如下:

[root@SparkWorker1 dylogs]# env
XDG_SESSION_ID=1629
HOSTNAME=SparkWorker1
TERM=linux
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=172.16.213.132 50080 22
HADOOP_PREFIX=/opt/hadoop/current
CATALINA_BASE=/opt/hadoop/current/share/hadoop/httpfs/tomcat
SSH_TTY=/dev/pts/1
QT_GRAPHICSSYSTEM_CHECKED=1
USER=root
MAIL=/var/spool/mail/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/java/default/bin:/opt/hadoop/current/bin:/opt/hadoop/current/sbin:/root/bin
PWD=/data/dylogs
LANG=zh_CN.UTF-8
HOME=/root

要获取crontab环境变量信息,可以设置如下计划任务:

* * * * * /usr/bin/env > /tmp/env.txt

等待片刻,env.txt输出内容如下:

[root@SparkWorker1 dylogs]# cat /tmp/env.txt
XDG_SESSION_ID=1729
SHELL=/bin/sh
USER=root
PATH=/usr/bin:/bin
PWD=/root
LANG=zh_CN.UTF-8
SHLVL=1
HOME=/root
LOGNAME=root
XDG_RUNTIME_DIR=/run/user/0
_=/usr/bin/env

从上面输出结果可知,shell命令行的PATH值为

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/java/default/bin:/opt/hadoop/current/bin:/opt/hadoop/current/sbin:/root/bin

而crontab中的PATH值为:

PATH=/usr/bin:/bin

对比crontab环境变量与shell终端环境变量的输出,可以发现两者的差异很大。大家可能遇到过,在shell命令行执行脚本都没有问题,而放到crontab后却执行异常,或者执行失败,此时,我们就需要考虑是否命令涉及的环境变量在crontab和shell命令行间存在差异。

例如,我们在crontab中执行了如下定时任务:

20 16 * * * php autosave.php

而如果我们的php是安装在/usr/local/bin/目录下的话,那么上面这个定时任务由于无法找到php命令,会运行失败。

那么,知道了环境变量问题,可能导致计划任务无法正常执行,怎么才能避免这个问题呢,这个交给大家一个终极大招,可以在crontab中加入如下配置,保证你的计划任务执行不会出现环境变量问题:

* * * * * source /$HOME/.bash_profile && command

这个其实是在执行计划任务命令之前,先加载了用户环境变量信息,由此可保证所有环境变量都可正常加载。

2、定时时间配置误区

时间是crontab的核心,稍微配置不当,就会出现问题,先看在整点时间设置时可能出现的错误,例如,设定每天2点执行一次任务,很多朋友可能这么写过:

* 2 * * * command

很明显,这个时间写法是错误的,当我们听到每天2点执行一次某任务时,很多人会把重点放在2点,而忽略了执行一次的需求。上面这个定时任务他会在2点开始执行,每分钟执行一次,总共执行60次。

正确的写法应该是这样的:

0 2 * * * command

这个才表示每天2点0分执行command对应的任务。

3、特殊符号%问题

%在crontab中是特殊符号,具体含义如下:

第一个%表示标准输入的开始,其余%表示换行符,看下面两个例子:

* * * * * cat >> /tmp/cat.txt 2>&1 % stdin out

查看/tmp/cat.txt的内容为:

stdin out

再看下面这个例子:

* * * * * cat >> /tmp/cat1.txt 2>&1 % stdin out 1 % stdin out 2 % stdin out 3

查看 /tmp/cat1.txt的内容如下:

stdin out 1
stdin out 2
stdin out 3

有输出内容可知,第一个%表示标准输入的开始,其余%表示换行符。

既然”%”是特殊字符,那么在crontab中使用时,就要特别注意,怎么使用这些特殊字符呢,很明显,使用转移字符即可,例如:

* * * * * cat >> /tmp/cat2.txt 2>&1 % Special character escape \%.

查看输出/tmp/cat2.txt 输出内容如下:

Special character escape %.

可以看到,执行成功了,并成功避开这个坑了。

4、关于crontab的输出重定向

在crontab执行的计划任务中,有些任务如果不做输出重定向,那么原本会输出到屏幕的信息,会以邮件的形式输出到某个文件中,例如,执行下面这个计划任务:

* * * * * /bin/date

这个计划任务是没有做输出重定向的,他的主要用途是输出时间,由于没有配置输出重定向,那么这个时间信息默认将以邮件的形式输出到/var/spool/mail/$USER(这个$USER对应的是系统用户,这里是root用户)文件中,大致内容如下:

From root@SparkWorker1.localdomain Fri Sep 21 12:58:02 2022
Return-Path: 
X-Original-To: root
Delivered-To: root@SparkWorker1.localdomain
Received: by SparkWorker1.localdomain (Postfix, from userid 0)
id F2745192AE; Fri, 21 Sep 2022 12:58:01 +0800 (CST)
From: "(Cron Daemon)" 
To: root@SparkWorker1.localdomain
Subject: Cron  /bin/date
Content-Type: text/plain; charset=UTF-8
Auto-Submitted: auto-generated
Precedence: bulk
X-Cron-Env: 
X-Cron-Env: 
X-Cron-Env: 
X-Cron-Env: 
X-Cron-Env: 
X-Cron-Env: 
X-Cron-Env: 
X-Cron-Env: 
Message-Id: 
Date: Fri, 21 Sep 2022 12:58:01 +0800 (CST)
2022年 09月 21日 星期五 12:58:01 CST

由此可见,输出内容还是很多的,如遇到任务有大量输出的话,会占用大量磁盘空间,显然,这个邮件输出最好关闭,怎么关闭呢,只需设置MAILTO环境变量为空即可,上面的计划任务,可做如下修改:

MAILTO=""
* * * * * /bin/date

这样,就不会发邮件信息到/var/spool/mail/$USER下了,但是问题并没有彻底解决,关闭mail功能后,输出内容将继续写入到/var/spool/clientmqueue中,长期下去,可能占满分区的inode资源,导致任务无法执行。

为了避免此类问题发生,建议任务都加上输出重定向,例如,可以在crontab文件中设置如下形式,忽略日志输出:

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

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

5、调试crontab问题的一般思路

要解决crontab相关异常问题,可按照如下思路进行调试:

(1)、通过/var/log/cron日志确认任务是否执行

(2)、如未执行则分析定时语句,是否是环境变量问题、特殊字符问题、时间配置问题、权限问题等。

(3)、确认crond服务开启,如果定时语句也正确,检查crond服务是否开启。

Systemd方式(centos7及以上)

[root@SparkWorker1 spool]# systemctl status crond.service

SysVinit方式(centos7以下)

[root@SparkWorker1 spool]# service crond status

(4)确认定时任务中命令是否执行成功

这个问题可通过输出获取错误信息进行调试,方法就是利用重定向获取输出,然后进行分析。举例如下:

* * * * * python /usr/local/dyserver/dypos.py >> /tmp/dypos.log 2>&1

通过加上“/tmp/dypos.log 2>&1”,就可以很快定位问题,因为这个dypos.py脚本在执行的时候会把错误信息都输出到dypos.log 中,接着查看dypos.log文件,问题一目了然:

[root@SparkWorker1 spool]# cat /tmp/dypos.log
/bin/sh: python: 未找到命令
/bin/sh: python: 未找到命令

显示python命令没有找到,很明显的就可以确定是环境变量的问题。这种方式定位问题非常有效。

以上是關於 Linux 下的 crontab,那些你不知道的知識點的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:良许Linux教程网。如有侵權,請聯絡admin@php.cn刪除
5個用於監視磁盤I/O性能的Linux工具5個用於監視磁盤I/O性能的Linux工具Apr 27, 2025 pm 04:45 PM

本指南探討了用於監視和故障排除磁盤I/O性能的基本Linux工具,這是對服務器速度和應用程序響應的關鍵度量。 磁盤I/O性能直接影響從和書面讀取數據的速度

在Linux中查找插入USB設備名稱的4種方法在Linux中查找插入USB設備名稱的4種方法Apr 27, 2025 pm 04:44 PM

對於新的Linux用戶,識別連接的設備至關重要,尤其是USB驅動器。 本指南提供了幾種命令行方法來確定USB設備的名稱,這對於格式化等任務必不可少。 雖然USB驅動器經常自動安裝(例如, /

如何在根(/)分區上修復'設備上沒有剩餘空間”如何在根(/)分區上修復'設備上沒有剩餘空間”Apr 27, 2025 pm 04:43 PM

Linux系統,特別是磁盤空間有限的系統,最常見的問題之一就是根分區(/)空間耗盡。 出現此問題時,您可能會遇到以下錯誤: No space left on device 別慌!這只是表示您的根目錄(/ 分區)已滿,這是一個常見問題,尤其是在磁盤空間有限的系統或全天候運行的服務器上。 發生這種情況時,您可能會遇到以下問題: 無法安裝或升級軟件包。 系統啟動失敗。 服務無法啟動。 無法寫入日誌或臨時文件。 本文將引導您完成識別問題、安全清理空間以及防止再次發生此問題的實用步驟。這些說明適用於初

2025年Linux的前16名記事本替代品2025年Linux的前16名記事本替代品Apr 27, 2025 pm 04:42 PM

本文探討了Linux用戶的一流記事本替代方案。 記事本雖然在Windows上很棒,但缺少Linux版本。 本指南提供了適合各種需求和偏好的各種選擇。 最高記錄的替代方案

如何在SystemD中創建和運行新服務單元如何在SystemD中創建和運行新服務單元Apr 27, 2025 pm 04:41 PM

幾天前,我遇到了32位CentOS 8分佈,並決定在較舊的32位系統上進行測試。 啟動後,我發現了一個網絡連接問題。連接將下降,每次重新啟動後都需要手動修復。這個公關

如何在Linux的硬盤上檢查不良扇區如何在Linux的硬盤上檢查不良扇區Apr 27, 2025 pm 04:40 PM

讓我們澄清什麼構成不良扇區或不良區塊:這是硬盤驅動器或閃存的一部分,它變得不可讀取或無法寫入,這通常是由於對磁盤表面的物理損害或閃爍的閃存閃存晶體管。 累積

如何強制CP命令無需提示即可覆蓋文件如何強制CP命令無需提示即可覆蓋文件Apr 27, 2025 pm 04:39 PM

CP命令(“複製”)是Linux和其他類似Unix的系統的基本工具,用於復製文件和目錄。 雖然對本地文件傳輸有效,但對於基於網絡的副本,SCP(安全副本)是首選的

修復' RM:無法刪除文件 - 設備或資源繁忙”錯誤修復' RM:無法刪除文件 - 設備或資源繁忙”錯誤Apr 27, 2025 pm 04:38 PM

在Linux系統中使用rm命令刪除文件或目錄時,如果遇到以下錯誤: rm: cannot remove 'file-or-directory': Device or resource busy 不用擔心,這是一個常見問題,這意味著您嘗試刪除的文件或目錄當前正被系統或正在運行的進程使用。 錯誤原因 “設備或資源繁忙”消息表示文件或目錄正在使用中。為了避免破壞系統或導致數據丟失,Linux阻止刪除正在使用的文件。 常見原因包括: 您的終端當前位於要刪除的目錄內。 程序或進程正在使用該文件或目錄。

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

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

熱工具

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

SecLists

SecLists

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

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器