linux下定時任務計劃的使用

一、定時任務之at實現;


PS本次操作以CentOS 7.5爲實驗環境;


1.1、at軟件包說明

最小化安裝,可能沒有at或atq這個命令,at來自於軟件包at,如果yum能用,直接:
yum -y install at

[root@node2 ~]# rpm -ql at
/etc/at.deny
/etc/pam.d/atd
/etc/sysconfig/atd
/usr/bin/at
/usr/bin/atq
/usr/bin/atrm
/usr/bin/batch
/usr/lib/systemd/system/atd.service
/usr/sbin/atd
/usr/sbin/atrun
/usr/share/doc/at-3.1.13
/usr/share/doc/at-3.1.13/ChangeLog
/usr/share/doc/at-3.1.13/Copyright
/usr/share/doc/at-3.1.13/Problems
/usr/share/doc/at-3.1.13/README
/usr/share/doc/at-3.1.13/timespec
/usr/share/man/man1/at.1.gz
/usr/share/man/man1/atq.1.gz
/usr/share/man/man1/atrm.1.gz
/usr/share/man/man1/batch.1.gz
/usr/share/man/man5/at.allow.5.gz
/usr/share/man/man5/at.deny.5.gz
/usr/share/man/man8/atd.8.gz
/usr/share/man/man8/atrun.8.gz
/var/spool/at
/var/spool/at/.SEQ
/var/spool/at/spool

要想運行at任務,必須要啓動atd.service服務:
systemctl status atd.service   查看狀態
systemctl start atd.service 啓動atd服務;
systemctl enable atd.service 讓atd服務器開機自動啓動;

1.2、at和其他幾個關聯組件

at      executes commands at a specified time.
在指定的時刻執行命令;

atq     lists the user's pending jobs, unless the user is the superuser; in that case, everybody's jobs are listed.
          The format of the output lines (one for each job) is: Job number, date, hour, queue, and username.
atq用來操作用戶追加的任務列表。如果是管理員查看,普通用戶的任務列表也會被列出來。

atrm   deletes jobs, identified by their job number.
通過任務的編號來刪除任務;

batch   executes commands when system load levels permit; in other words, when the load average 
            drops below 0.8,or the value specified in the invocation of atd.
batch會讓系統自行選擇在系統資源較空閒的時間去執行指定的任務;
用法和at一樣,這裏不介紹了,工作中一般at的用的比較少,我們的重心放在
後面要講的cron上。

1.3、at的選項和介紹

常見的選項有:
-l:查看作業隊列,相當於atq
-f /PATH/FROM/SOMEFILE:從指定文件中讀取作業任務,而不用再交互式輸入;
-d:刪除指定的作業,相當於atrm;
-c:查看指定作業的具體內容;
-q QUEUE:指明隊列;

注意:作業執行結果是以郵件發送給提交作業的用戶;
at的作業有隊列,用單個字母表示,默認都使用a隊列;

at的語法結構爲:
at  [OPTION]... TIME

TIME可以設定爲以下的形式,非常靈活多變:
HH:MM [YYYY-mm-dd]
noon,midnight, teatime
tomorrow
now+#
    UNIT:minutes, hours, days, OR weeks
比如:
now +5minutes 表示任務將在5分鐘後執行;
now +1hours 表示任務將在1小時候執行;
now + 31days 表示任務將在1個月後執行;
now +1weeks表示任務將在1周後執行;
12:32 表示任務將在今天的12:32分的時候執行;

[root@node2 ~]# at now+5minutes
at> cat /etc/fstab
at> <EOT>
job 2 at Sat Oct 27 06:21:00 2018
[root@node2 ~]# date
Sat Oct 27 06:17:03 CST 2018

<EOT> 部分是通過Ctrl +D來保存的;可以等5分鐘後去查看郵件;
具體用法參見mail。

[root@node2 ~]# at now+5minutes
at> cat /etc/fstab
at> <EOT> 
job 3 at Sat Oct 27 06:25:00 2018
[root@node2 ~]# at -l
3   Sat Oct 27 06:25:00 2018 a root
[root@node2 ~]# at now+1weeks
at> mkdir -p /data/backup 
at> tar -zcvf /data/backup/var1.tar.gz /var/log &>/dev/null
at> <EOT>
job 4 at Sat Nov  3 06:20:00 2018
[root@node2 ~]# at -l
3   Sat Oct 27 06:25:00 2018 a root
4   Sat Nov  3 06:20:00 2018 a root
任務隊列有兩個,如果要查看詳細內容,可以使用
at -c 任務編號
[root@node2 ~]# at -c 4
#!/bin/sh
...... 處理省略非常多的內容
${SHELL:-/bin/sh} << 'marcinDELIMITER2d55ee54'
mkdir -p /data/backup
tar -zcvf /data/backup/var1.tar.gz /var/log &>/dev/null

marcinDELIMITER2d55ee54
[root@node2 ~]# 
中間省略的部分,都是一些與環境有關的東西。
時間內容就是上邊的部分;
[root@node2 ~]# at -d 4
[root@node2 ~]# at -l
3   Sat Oct 27 06:25:00 2018 a root
刪除了任務編號4的任務。

二、定時任務之cron實現;

2.1、cron的軟件包cronie

/etc/cron.d
/etc/cron.d/0hourly
/etc/cron.deny
/etc/pam.d/crond
/etc/sysconfig/crond
/usr/bin/crontab
/usr/lib/systemd/system/crond.service
/usr/sbin/crond
/usr/share/doc/cronie-1.4.11
/usr/share/doc/cronie-1.4.11/AUTHORS
/usr/share/doc/cronie-1.4.11/COPYING
/usr/share/doc/cronie-1.4.11/ChangeLog
/usr/share/doc/cronie-1.4.11/INSTALL
/usr/share/doc/cronie-1.4.11/README
/usr/share/man/man1/crontab.1.gz
/usr/share/man/man5/crontab.5.gz
/usr/share/man/man8/cron.8.gz
/usr/share/man/man8/crond.8.gz
/var/spool/cron

[root@node2 cron]# rpm -ql crontabs
/etc/cron.daily
/etc/cron.hourly
/etc/cron.monthly
/etc/cron.weekly
/etc/crontab
/etc/sysconfig/run-parts
/usr/bin/run-parts
/usr/share/man/man4/crontabs.4.gz
/usr/share/man/man4/run-parts.4.gz

最關鍵的是一個叫做crontab的命令,我們要書寫的非系統定時任務就是通過此程序來編寫的;
要保證crond.service服務有啓動,cron定時任務纔會生效:
systemctl status crond.service  查看crond服務狀態;
systemctl enable crond.service  開機自動啓動crond服務;
systemctl disable crond.service 開機禁止啓動crond服務;
systemctl start crond.service   啓動crond服務;
systemctl stop crond.service  停止crond服務;
 systemctl restart crond.service   重啓crond服務;

 crontabs軟件包提供了系統級別的定時任務的配置文件和一些初始狀態的腳本,正常情況,我們不應該
 去動這些腳本。特別是系統默認自帶的東西,不要去修改他們,如果一定要用系統的定時任務,無非
 是我們自己去按照規定去添加。

2.2、提交cron定時任務說明

向crond提交作業的方式不同於at,它需要使用專用的配置文件,此文件有固定格式,
不建議使用文本編輯器直接編輯此文件;要使用crontab命令;

cron任務分爲兩類:
1、系統cron任務
主要用來實現系統自身的維護;可以手動編輯修改/etc/crontab文件

2、用戶cron任務
通過crontab命令(一個帶有SUID權限的工具)增刪改查;

2.3、系統定時任務配置文件

查看配置文件/etc/crontab
[root@node2 ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
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. 如果定義的cron任務有多個,每行寫一個,共7個字段;字段分別爲,
分 時 日 月 周 user-name表示用戶名, 後邊表示要執行的命令或腳本;
2. 由於這裏的環境變量PATH定義的可選值與系統bash接口略有差別,這裏範圍更小,
所以建議,定義定時任務中用到的命令建議使用絕對路徑,或者自定義PATH環境變量;
3. 執行結果郵件發送給MAILTO指定的用戶

2.4、非系統(用戶)定時任務配置文件

系統的cron配置爲/var/spool/cron/USERNAME
其中USERNAME表示誰的定時任務,它的配置文件語法和系統配置文件語法差別不大,
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
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
# |  |  |  |  |
# *  *  *  *  *   command to be executed    

和系統配置文件查看不多,寫定時任務的時候不必要指定用戶了;
注意點:
1.每行定義一個cron任務,共6個字段;
2.此處的環境變量不同於用戶登錄後獲得的環境,因此,建議命令使用絕對路徑,或者自定義PATH環境變量;
3.郵件發送給當前用戶;

2.5、crontab命令選項和說明

crontab的常建語法結構和選項:
crontab [-u user] [-l | -r | -e] [-i]

-e:編輯當前用戶的或者指定用戶的crontab,如果沒有定時任務,會作爲一個新的文件編輯,編輯默認是以vi編輯
器來編輯,可以通過顯式設定VISUAL或EDITOR環境變量來修改使用指定的編輯器來編輯。一但編輯的crontab保
存退出後,crontab會自動被安裝成定時任務計劃。
比如:
export EDITOR="/usr/bin/nano" 或 export EDITOR="/usr/bin/emasc",然後再去crontab -e
nano和emacs都是文本編輯器,默認都是沒有安裝的,需要自己手動指定安裝。
-l:列出當前用戶或者指定用戶的crontab到標準輸出。
-r:移除當前用戶或者指定用戶的所有定時任務,即刪除/var/spool/cron/USERNAME文件;(危險,沒有交互式
操作提示)
-i:在使用-r選項移除所有任務時提示用戶確認信息;
-u user:指定管理給定用戶的crontab,只有超級管理員用戶才能管理,普通用戶不能使用此選項;

小技巧和注意事項:
1、如果不想把定時任務運行結果通知給指定用戶
COMMAND > /dev/null  標準錯誤信息還是會以郵件的形式通知給用戶;
COMMAND &> /dev/null 所有輸出信息都不會以郵件的形式通知用戶;
2.定義COMMAND時,如果命令需要用到%,需要對其轉義;但放置於單引號中的%不用轉義亦可;
3.某任務在指定的時間因關機未能執行,下次開機不會自動執行;
4.如果期望某時間因故未能按時執行,下次開機後無論是否到了相應時間點都要執行一次,可使用anacron實現;

2.6、crontab配置定時任務時候的時間表示

時間格式一共5位,分別對應:

* * * * *
分 時 日 月 周
分鐘有效值:0 - 59;
時的有效值:0 - 23;
日的有效值: 1 - 31;
月的有效值:1 - 12 或 jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec;
周的有效值:0 - 6 ,星期天可以用0或7表示,這個是個特例,也可以用周的英文縮寫,
sun,mon,tue,wed,thu,fri,sat
  • 指定特定值
給定時間點有效取值範圍內的值;
注意:day of week和day of month一般不同時使用;

例如:
3 * * * *:執行頻率爲 每小時執行一次;每小時的第3分鐘執行;
3 4 * * 5:執行頻率爲 每週執行一次;每週5的4點3分執行;
5 6 7 * *:執行頻率爲 每月執行一次;每月的7號的6點5分執行;
7 8 9 10 *:執行頻率爲 每年執行一次;每年的10月9號8點7分執行;
  • 取所有值
給定時間點上有效取值範圍內的所有值;表示"每xxx"的含義;
  • 離散取值
在時間點上使用逗號分隔的多個值;
x,y,z
例如:
0 8,20 * * 3,7:這種不建議;(出現了20號,又出現了每週3,周天);
9 8 * * 3,7:每週三和週日執行的8點9分執行;
  • 連續取值
在時間點上使用符號短破折號"-"連接開頭和結束
x-y
例如:
0 9-18 * * 1-5:周1到周5,每天的9點到18點,執行;(假設上午9點上班,下午18點下班,雙休,這就是
工作日執行要執行的任務)
  • 步長取值
在指定時間點上,定義步長:
/number :其中number表示步長;
指定的時間點不能被步長整除時,其意義將不復存在;
最小時間單位爲"分鐘",想要完成"秒"級別任務,需要額外藉助於其他機制,例如
可以定義每分鐘定時計劃任務,再利用腳本實現在每分鐘之內,循環執行多次;

例如:
*/5 * * * *:每5分鐘執行一次;
* */1 * * *:每1小時執行一次;
* * */5 * *:每5天執行一次;
*/7 * * * *:這個並不完全是每7分鐘執行一次,這種不整除的現象,不建議使用。

2.7、crontab權限控制相關

[root@node2 ~]# ls -ld /
dr-xr-xr-x. 17 root root 4096 Oct 16 18:53 /
[root@node2 ~]# ls -ld /var/spool/
drwxr-xr-x. 9 root root 90 Oct 27 05:55 /var/spool/
[root@node2 ~]# ls -ld /var/spool/cron
drwx------. 2 root root 19 Oct 27 10:59 /var/spool/cron
[root@node2 ~]# ls -l /var/spool/cron/
total 8
-rw------- 1 root   root   45 Oct 27 11:18 root
-rw------- 1 yanhui yanhui 15 Oct 27 10:21 yanhui
[root@node2 ~]# id yanhui
uid=1000(yanhui) gid=1000(yanhui) groups=1000(yanhui)
[root@node2 ~]# which crontab
/usr/bin/crontab
[root@node2 ~]# ls -l /usr/bin/crontab
-rwsr-xr-x. 1 root root 57536 Jul 30  2014 /usr/bin/crontab

1、首先"/"目錄,普通用戶有讀和執行權限,所以普通用戶能夠查看"/"目錄本身以及"/"目錄下的展開(ls -l /);
2、/var 和/var/spool 目錄,普通用戶有讀和執行權限,所以普通用戶能查看目錄本身以及其他的展開列表;
3、/var/spool/cron 這個目錄,普通用戶是沒有任何權限的,所以普通用戶無法查看和直接編輯;
4、爲什麼crontab,普通用戶也可以在/var/spool/cron目錄下寫,是因爲crontab命令有SUID權限;

如何對普通用戶使用cron做限制?
 1、如果cron.allow存在
普通用戶想要使用cron,必須配置用戶名在配置文件/etc/cron.allow中(一行一個用戶名);
/etc/cron.allow會影響/etc/cron.deny的因爲,如果一個普通用戶的用戶名出現/etc/cron.allow和
/etc/cron.deny中,以/etc/cron.allow爲主;
 2、如果cron.allow不存在且cron.deny文件存在
  普通用戶想要使用cron,用戶名不能出現在配置文件/etc/cron.allow中;
 3、cron.allow文件和cron.deny文件都存在
 如果兩個配置文件都爲空,表示只有管理員用戶可以使用。其他情況,請參見第1種情形;

說明: 默認情況是cron.deny存在,你可以理解爲黑名單(上邊的第二種情況),/etc/cron.allow存在,你可以
理解爲白名單,普通想要使用cron,就必須在/etc/cron.allow配置文件中添加用戶名;管理員用戶不受到
/etc/cron.allow以及/etc/cron.deny的影響。

提示不能使用:(crontab 不能用)
[yanhui@node2 ~]$ crontab -e
You (yanhui) are not allowed to use this program (crontab)
See crontab(1) for more information
[yanhui@node2 ~]$ crontab -l
You (yanhui) are not allowed to use this program (crontab)
See crontab(1) for more information

2.8、cron定時任務示例(以用戶定時任務爲主)

1、每12小時備份一次/etc目錄至/backups目錄中,保存文件 名稱格式爲“etc-yyyy-mm-dd-hh.tar.xz”
要添加的任務計劃爲:

* */12 * * *  /usr/bin/mkdir -p /backups  >/dev/null && /usr/bin/tar -JPcvf /backups/etc-`date '+%Y-%m-%d-%H'`.tar.xz /etc >/dev/null
* 

2、每週2、4、7備份/var/log/secure文件至/logs目錄中,文件名格式爲“secure-yyyymmdd”;

要添加的任務計劃爲:

* * * * 2,4,7 /usr/bin/mkdir -p /logs >/dev/null && tar -JcvfP /logs/secure-`date +%Y%m%d`.tar.xz /var/log/secure >/dev/null

3、每兩小時取出當前系統/proc/meminfo文件中以S或M開頭的行信息追加至/tmp/meminfo.txt文件中;

* */2 * * *  /usr/bin/grep -E '^(S|M)' /proc/meminfo >> /tmp/meminfo.txt

4、制定每週三凌晨三、五點10分執行某個腳本,輸出當前時間,時間格式爲 2017-12-28 10:00:00;

我的腳本內容爲:
[root@node2 ~]# cat /var/tmp/print_dtime.sh
#! /bin/bash

PATH=$PATH:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
LANG="en_US.UTF-8"
export PATH LANG
source /etc/profile
shopt -u expand_aliases  #關閉 bash alias 擴展

echo `date +'%Y-%m-%d %H:%M:%S'`
[root@node2 ~]# 

定時任務計劃爲:
10 3,5 * * 3 bash /var/tmp/print_dtime.sh

linux下定時任務計劃的使用

linux下定時任務計劃的使用

linux下定時任務計劃的使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章