周期性任務計劃: Crontab

来源:https://www.cnblogs.com/jzbgltb/archive/2018/09/06/9596663.html
-Advertisement-
Play Games

文中部分內容摘自駿馬金龍的博客,查看可 "點擊" 1. crontab簡述 crontab命令用於周期性的執行任務,想要執行這個命令,需要首先啟動crond(守護進程)服務才行 crontab是配置管理crontab file的功程式,也可以移除或列出用於為 cron 提供服務的現有表項 cront ...


文中部分內容摘自駿馬金龍的博客,查看可點擊


1. crontab簡述

  • crontab命令用於周期性的執行任務,想要執行這個命令,需要首先啟動crond(守護進程)服務才行
  • crontab是配置管理crontab file的功程式,也可以移除或列出用於為 cron 提供服務的現有表項
  • crontab file存在於多處,包括系統定時任務文件/etc/crontab和/etc/cron.d/*,還有獨屬於各用戶的任務文件/var/spool/cron/USERNAME

cron的守護進程(daemon)

Centos7可以使用以下方式查看,Centos6可以使用:service crond status
看到enable和running即可
[root@Centos7 ~]# systemctl status crond.service
● crond.service - Command Scheduler
   Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2018-09-05 15:14:24 CST; 1h 9min ago
Main PID: 1437 (crond)
   CGroup: /system.slice/crond.service
           └─1437 /usr/sbin/crond -n

Sep 05 15:14:24 Centos7.4 systemd[1]: Started Command Scheduler.
Sep 05 15:14:24 Centos7.4 systemd[1]: Starting Command Scheduler...
Sep 05 15:14:24 Centos7.4 crond[1437]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 80% if used.)
Sep 05 15:14:25 Centos7.4 crond[1437]: (CRON) INFO (running with inotify support)

運行進程與設置開機自啟

Centos7
[root@Centos7 ~]# systemctl start crond.service
[root@Centos7 ~]# systemctl enable crond.service

Centos6
[root@Centos7 ~]# service crond start
[root@Centos7 ~]# chkconfig --livel 3 crond on

2. crontable 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看是否有任務計劃條目需要執行。

2.1 cron任務分兩類

  • 系統cron任務:主要用於實現系統自身的維護
    1. 只能手動編輯/etc/crontab文件,不能使用crontab命令
  • 用戶cron任務:
    1. 可以通過編輯/var/spool/cron/USERNAME文件
    2. 也可以通過命令crontab -e來進行,此種方式帶語法檢查功能,推薦此種方式

2.2 系統cron的配置格式:/etc/crontab

[root@Centos7 ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin        ##cron任務只能識別這幾個路徑下的命令,如果命令不在這幾個目錄中,就會找不到命令,所以建議使用全路徑
MAILTO=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

這個文件中包含如下信息:

1. SHELL:周期執行任務用的shell
2. PATH:命令路徑
3. MAILTO:執行結果發送給哪個用戶
4. * * * * * 分別表示:分、時、日、月、周
5. username:執行命令的用戶(用戶cron任務沒有)
6. command to be executed:周期執行的任務/命令,在預設情況下命令會根據/etc/crontab中指定的PATH路徑進行查找,所以建議使用全路徑

2.3 時間表示法

(1)特定值:
    給定時間點有效取值範圍內的值;
Note:day of week 和 day of month一般不同時使用
Note:如果定義的日和周衝突了,則會多次執行(不包括因為*號導致的衝突)。例如每月的15號執行該任務,同時又定義了周三執行該任務,正常無衝突情況下,將在周三和每月15號執行,但如果某月的15號同時是周三,則該任務在此日執行兩次。因此,應該儘力避免同時定義周和日的任務

(2) *
    給定時間點上有效取值範圍內的所有值;表示每...(每分鐘0-59、每小時0-24、每天1-29/30/31、每月1-12、每周0-6)

(3)離散取值:,
    在時間點上使用逗號分隔的多個值
        #,#,#

(4)連續取值:-
    在時間點上使用“ - ”連接開頭和結束
        #-#

(5)在指定時間點上,定義步長
    /#:#即步長

Note:
    (1)指定的時間點不能被步長整除時,其意義將不復存在
    (2)最小時間單位為“分鐘”,想完成“秒”級人物,需要額外藉助於其他機制
        定義成每分鐘任務:再利用腳本實現在每分鐘內,迴圈多次

另外一個需要註意的時間段設置是,使用*號導致低級別的時間覆蓋高級別的時間。例如"* */2 * * *",它不表示每兩小時執行一次任務,而是每分鐘執行一次,儘管在小時位上設置了每隔兩小時,但在分鐘位上設置的是每分鐘,所以它仍然表示每分鐘執行一次任務。同理,"*/5 */2 * * *"分鐘位上的設置覆蓋小時位上的設置,表示每5分鐘執行一次而忽略小時位的設置;"00 */2 */5 * *"表示每隔兩小時的整點執行一次任務而忽略天數位的設置

實例

3 * * * *     每小時的第3分鐘執行一次
3 4 * * *     每周五的04:03執行一次
5 6 7 * *     每月7號的06:05執行一次
7 8 9 10 *    每年10月9日的08:07執行一次
9 8 * * 3,7   每周三和周日的08:09執行一次
00 8,20 * * 3,7    每周三和周日的8:00和20:00執行一次
0 9-18 * * 1-5     工作日的工作時間
*/2 * * * *   每2分鐘執行一次
*/7 * * * *   每7分鐘執行一次(60除7除不開,所以最後一次是間隔4分鐘就執行了,然後下麵一小時重新執行)
*/30 * * * *  每半小時執行一次
00 */2 * * *  沒兩個小時的整點執行一次

3. crontab命令使用

NAME
crontab - maintains crontab files for individual users

SYNOPSIS

crontab [-u user] file
crontab [-u user] [-l | -r | -e] [-i] [-s]
crontab -n [ hostname ]
crontab -c

OPTIONS

-e    編輯任務
-l    列出當前用戶的crontab任務都有什麼
-r    移除所有任務,即刪除/var/spool/cron/USERNAME文件(推薦使用#進行註釋,或者直接刪除相應條目)
-i    在使用-r選項移除所有任務時提示用戶確認
-u    指定編輯哪個用戶的crontab

Note:運行結果以郵件通知給當前用戶;如果拒絕接受郵件可以:
1. COMMAND > /dev/null ##將正確的執行結果發送給null
2. COMMAND &> /dev/null ##將正確與錯誤的執行結果發送給null

Note:定義COMMAND時,如果命令需要用到%,需要對其轉義;因為直接使用%表示換行的特殊意義,且第一個%後的所有字元串將當作命令的標準輸入。

思考:某任務在指定的時間因關機未能執行,下次開機會不會自動執行?
不會執行,只能等待下一個時間節點
如果期望某時間因故未能按時執行,下次開機後無論是否到了響應時間點都要執行一次,可使用anacron實現

EXAMPLES

1、每12小時備份一次/etc目錄至/backup目錄中,保存文件 名稱格式為“etc-yyyy-mm-dd-hh-MM-SS.tar.gz”
00 */12 * * * /bin/tar -zcf /backup/etc-$(date "+\%F-\%H-\%M-\%S").tar.gz /etc

2、每周2、4、7備份/var/log/secure文件至/logs目錄中,文件名格式為“secure-yyyymmdd.tar.gz”;
* * * * 2,4,7 /bin/tar -zcf /log/secure-$(date +\%F).tar.gz /var/log/secure

3、每年9月份的10號到24號這段時間,每2小時取出當前系統/proc/meminfo文件中以S或M開頭的行信息,追加至/tmp/meminfo.txt文件中
00 */2 9-24 10 * /bin/egrep "^(S|M)" /proc/meminfo >> /tmp/meminfo.txt 2>/dev/null

4. crontab執行不成功的排查方式

1、查看crontab的日誌文件/var/log/cron

[Allen@Centos7 ~]$ sudo tail -f /var/log/cron
Sep  6 09:14:01 Centos7 CROND[24490]: (root) CMD (/bin/tar -zcf /backup/etc-"$(date "+%F-%H-%M-%S")".tar.gz /etc &> /dev/null)
Sep  6 09:15:01 Centos7 CROND[24510]: (root) CMD (/bin/tar -zcf /backup/etc-"$(date "+%F-%H-%M-%S")".tar.gz /etc &> /dev/null)
Sep  6 09:15:01 Centos7 CROND[24511]: (Allen) CMD (/usr/sbin/ntpdate -u ntp.aliyun.com >/dev/null 2>&1)
Sep  6 09:16:01 Centos7 CROND[24535]: (root) CMD (/bin/tar -zcf /backup/etc-"$(date "+%F-%H-%M-%S")".tar.gz /etc &> /dev/null)
Sep  6 09:17:01 Centos7 CROND[24552]: (root) CMD (/bin/tar -zcf /backup/etc-"$(date "+%F-%H-%M-%S")".tar.gz /etc &> /dev/null)
Sep  6 09:18:01 Centos7 CROND[24569]: (root) CMD (/bin/tar -zcf /backup/etc-"$(date "+%F-%H-%M-%S")".tar.gz /etc &> /dev/null)
Sep  6 09:19:01 Centos7 CROND[24586]: (root) CMD (/bin/tar -zcf /backup/etc-"$(date "+%F-%H-%M-%S")".tar.gz /etc &> /dev/null)
Sep  6 09:20:01 Centos7 CROND[24605]: (root) CMD (/bin/tar -zcf /backup/etc-"$(date "+%F-%H-%M-%S")".tar.gz /etc &> /dev/null)
Sep  6 09:20:01 Centos7 CROND[24606]: (Allen) CMD (/usr/sbin/ntpdate -u ntp.aliyun.com >/dev/null 2>&1)
Sep  6 09:21:01 Centos7 CROND[24670]: (root) CMD (/bin/tar -zcf /backup/etc-"$(date "+%F-%H-%M-%S")".tar.gz /etc &> /dev/null)

2、使用crond命令的調試
參考駿馬金龍博客


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 訪問 https://extensions.gnome.org/ 網站(註意:需要安裝 chrome-gnome-shell rpm 包來使得系統能與web進行通信) 安裝插件: notifications alert 消息提醒 permanent notification 消息提醒,不消失 在用戶 ...
  • 在11上安裝mysql yum install mariadb mariadb-server -y 在mysql的配置文件my.cnf中加入 init_connect='SET collation_connection = utf8_unicode_ci' init_connect='SET NAM ...
  • 第1章 NFS介紹 1.1 NFS基本概述 NFS(Network File System)網路文件系統 主要功能是通過區域網絡讓不同的主機系統之間可以共用文件或目錄。 NFS(Network File System)網路文件系統 NFS系統和Windows網路共用、網路驅動器類似, 只不過wind ...
  • 快速啟動是首先在Windows 8中實現並延續到Windows 10的功能,可在啟動PC時提供更快的啟動時間。它是一個方便的功能,也是大多數人在不知情的情況下使用的功能,但還有一些功能會在他們掌握新PC時立即禁用它。 什麼是快速啟動? Windows PC通常以多種高級配置和電源介面(ACPI)電源 ...
  • 在Microsoft Edge中,當您打開多個選項卡時,瀏覽器將顯示“您要關閉所有選項卡嗎?” 警告,以防止您意外關閉重要標簽。 通常,在沒有第二個想法的情況下,您會立即禁用此功能,檢查提示中的“始終關閉所有選項卡”選項。唯一需要註意的是,Edge不包含重新啟用消息的設置,如果以後,您會發現它是您需 ...
  • 我造輪子,你造車,創客一起造起來!塔克創新資訊【塔克社區 www.xtark.cn 】【塔克博客 www.cnblogs.com/xtark/ 】 本文介紹X-CTR100控制器與樹莓派Linux系統組成機器人平臺。首先介紹與樹莓派串口通信,後介紹機器人平臺搭建。這種上下位機平臺架構常用於機器人RO... ...
  • 一、環境準備 系統:centos7 and centos6.8 172.16.1.11 二、開始安裝 安裝yum源 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 安裝epe ...
  • 1.下載 2.解壓 3.重命名 4.編譯 有可能會出現 那就去安裝 成功了 安裝PHP-redis擴展 1.下載 2.解壓 3.找到phpize文件,生成配置 在redis-4.0.2文件夾中執行 4.配置 這個時候會報一些錯誤,打開php.ini 去除shell_exec,proc_open 5. ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...