通過任務計劃,可以讓系統自動的按時間或周期性任務執行任務
環境準備
[root@centos8 ~]#yum -y install postfix
[root@centos8 ~]#systemctl enable --now postfix
未來的某時間點執行一次任務
- at 指定時間點,執行一次性任務
- batch 系統自行選擇空閑時間去執行此處指定的任務
周期性運行某任務
- cron
一次性任務
at 工具
- 由包 at 提供
- 依賴與atd服務,需要啟動才能實作at任務
-
at佇列存放在/var/spool/at目錄中,ubuntu存放在/var/spool/cron/atjobs目錄下
-
執行任務時PATH變數的值和當前定義任務的用戶身份一致
at 命令:
at [option] TIME
常用選項:
-V 顯示版本資訊
-t time 時間格式 [[CC]YY]MMDDhhmm[.ss]
-l 列出指定佇列中等待運行的作業;相當于atq
-d N 洗掉指定的N號作業;相當于atrm
-c N 查看具體作業N號任務
-f file 指定的檔案中讀取任務
-m 當任務被完成之后,將給用戶發送郵件,即使沒有標準輸出
at 時間格式:
HH:MM 在今日的 HH:MM 進行,若該時刻已過,則明天此時執行任務 02:00 HH:MM YYYY-MM-DD 規定在某年某月的某一天的特殊時刻進行該項任務 02:00 2016-09-20 HH:MM[am|pm] [Month] [Date] 06pm March 17 17:20 tomorrow HH:MM[am|pm] + number [minutes|hours|days|weeks], 在某個時間點再加幾個時間后才進行該 項任務 now + 5 min 02pm + 3 days
范例:
echo touch /root/at.log | at 9:34
at 任務執行方式:
- 互動式
- 輸入重定向
- at -f file
/etc/at.{allow,deny} 控制用戶是否能執行at任務
- 白名單:/etc/at.allow 默認不存在,只有該檔案中的用戶才能執行at命令
- 黑名單:/etc/at.deny 默認存在,拒絕該檔案中用戶執行at命令,而沒有在at.deny 檔案中的使用者則可執行
- 如果兩個檔案都不存在,只有 root 可以執行 at 命令
周期性任務計劃 cron
周期性任務計劃cron相關的程式包:
- cronie:主程式包,提供crond守護行程及相關輔助工具
- crontabs:包含CentOS提供系統維護任務
- cronie-anacron:cronie的補充程式,用于監控cronie任務執行狀況,如:cronie中的任務在過去該運行的時間點未能正常運行,則anacron會隨后啟動一次此任務
cron 依賴于crond服務,確保crond守護處于運行狀態:
#CentOS 7 以后版本:
systemctl status crond
#CentOS 6:
service crond status
cron任務分為
- 系統cron任務:系統維護作業,/etc/crontab 主組態檔, /etc/cron.d/ 子組態檔
- 用戶cron任務:保存在 /var/spool/cron/USERNAME(ubuntu 系統存放在/var/spool/cron/crontabs/USERNAME),利用 crontab 命令管理
計劃任務日志:/var/log/cron
用戶計劃任務
- 每個用戶都有專用的cron任務檔案:/var/spool/cron/USERNAME
- 默認標準輸出和錯誤會被發郵件給對應的用戶,如:wang創建的任務就發送至wang的郵箱
- root能夠修改其它用戶的作業
- 用戶的cron 中默認 PATH=/usr/bin:/bin,如果使用其它路徑,在任務檔案的第一行加PATH=/path或者加入到計劃任務執行的腳本中
- 第六個欄位指定要運行的命令, 該行的整個命令部分,直至換行符或“%”字符,指定的shell執行.除非使用反斜杠(\)進行轉義,否則該命令中的“%”字符將變為換行符,并且第一個%之后的所有資料將作為標準輸入發送到該命令,
crontab命令格式:
crontab [-u user] [-l | -r | -e] [-i]
常用選項:
-l 列出所有任務
-e 編輯任務
-r 移除所有任務
-i 同-r一同使用,以互動式模式移除指定任務
-u user 指定用戶管理cron任務,僅root可運行
控制用戶執行計劃任務:
/etc/cron.{allow,deny}
添加默認編輯器 (默認為vi)
#CentOS
[root@CentOS8-8 ~]# vim /etc/profile.d/env.sh PS1='\[\e[1;34m\][\u@\h \W]\$ \[\e[0m\]' export EDITOR=vim
#ubunt
root@ubuntu18-19:~# vim .profile
# ~/.profile: executed by Bourne-compatible login shells.
if [ "$BASH" ]; then
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
fi
mesg n || true
export EDITOR=vim
定制計劃常用選項:任務 每十分鐘執行掃描磁盤腳本
crontab -e
在腳本中指定PATH變數 [root@centos8 ~]#crontab -l * * * * * /data/test.sh [root@centos8 ~]#cat /data/test.sh #!/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin useradd hehe echo $PATH
[root@centos8 ~]#cat /usr/bin/disk_check.sh #!/bin/bash # #******************************************************************** #Author: wangxiaochun #QQ: 29308620 #Date: 2020-05-08 #FileName: disk_check.sh #URL: http://www.wangxiaochun.com #Description: The test script #Copyright (C): 2020 All rights reserved #******************************************************************** WARNING=10 df | sed -En '/^\/dev\/sd/s@^([^ ]+).* ([0-9]+)%.*@\1 \2@p'| while read DEVICE USE;do [ $USE -gt $WARNING ] && echo "$DEVICE will be full,USE:$USE" | mail -s diskfull root done [root@centos8 ~]#crontab -l */10 * * * * check_disk.sh
范例2
[root@centos8 ~]#cat check_disk.sh #!/bin/bash df | awk -F ' +|%' '/^\/dev\/sd/{if($5 > 10){system("echo "$1" will be full,use:" $5 "| mail -s warning [email protected]")} }' [root@centos8 ~]#crontab -l */10 * * * * /root/check_disk.sh
范例3
[root@centos8 ~]#cat check_disk2.sh #!/bin/bash WARNING=2 df | awk -F ' +|%' '/^\/dev\/sd/{print $1,$5}'|while read DISK USE;do if [ $USE -gt $WARNING ];then echo "$DISK will be full,use:$USE" | mail -s diskwarning [email protected] fi done [root@centos8 ~]#crontab -l */10 * * * * /root/check_disk2.sh

范例:
[root@centos8 ~]#man 5 crontab
For example, "0-23/2" can be used in the 'hours' field to specify command
execution for every other hour (the alternative in the V7 standard is
"0,2,4,6,8,10,12,14,16,18,20,22")
#例如,“0-23/2”可以用在
#'hours'欄位指定每隔一個小時執行一次命令(在V7標準為“0、2、4、6、8、10、12、14、16、18、20、22”),
范例:每個月日期和星期幾欄位的關系
[root@centos8 ~]#man 5 crontab
Note: The day of a command's execution can be specified in the following two
fields — 'day of month', and 'day of week'. If both fields are restricted
(i.e., do not contain the "*" character), the command will be run when either
field matches the current time. For example, "30 4 1,15 * 5" would cause a
command to be run at 4:30 am on the 1st and 15th of each month, plus every
Friday.
注意:命令的執行日期可以在以下兩個欄位中指定——‘day of’month和day of week,如果兩個欄位都被限制(即不包含“*”字符‐acter),命令將在任意欄位與當前時間匹配時運行,例如,“30 4 1,15 * 5”將導致在每個月1日和15日凌晨4:30運行命令,加上每個星期五,
計劃任務默認的PATH變數太少在開頭添加變數PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
面試題:11月每天的6-12點之間每隔2小時執行/app/bin/test.sh
[root@centos8 ~]#crontab -l 0 6-12/2 * 11 * /app/bin/test.sh
cron任務中不建議使用%,它有特殊用途,它表示換行的特殊意義,且第一個%后的所有字串會被將
成當作命令的標準輸入,如果在命令中要使用%,則需要用 \ 轉義
注意:將%放置于單引號中是不支持的
范例: 在crontab中%的用法
30 2 * * * /bin/cp -a /etc/ /data/etc`date +\%F_\%T` 30 2 * * * /bin/cp -a /etc/ /data/etc`date +‘%F_%T’` 有問題
范例: 在crontab中%的用法
[root@centos8 ~]#crontab -l * * * * * mail -s "test" wang%wang,%%how are you?% [root@centos8 ~]# cat /var/spool/mail/wang From [email protected] Sat Jul 4 23:58:01 2020 Return-Path: <[email protected]> X-Original-To: wang Delivered-To: [email protected] Received: by centos8.localdomain (Postfix, from userid 0) id 0B03860272; Sat, 4 Jul 2020 23:58:01 +0800 (CST) Date: Sat, 04 Jul 2020 23:58:01 +0800 To: [email protected] Subject: test User-Agent: Heirloom mailx 12.5 7/5/10 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-Id: <20200704155801[email protected]> From: [email protected] (root) wang, how are you? [root@centos8 ~]#
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/247909.html
標籤:Linux
上一篇:Atomic Simulation Environment (ASE)中.traj檔案如何打開
下一篇:Centos7 重置密碼
