一、什么是定時(shí)任務(wù)?
周期性的執(zhí)行任務(wù)計(jì)劃的軟件,Linux定時(shí)任務(wù)的常用軟件crond.
二、使用定時(shí)任務(wù)軟件,按需重復(fù)執(zhí)行工作。
例如:備份都是0點(diǎn)以后,2點(diǎn)爬起來(lái)備份,4點(diǎn)以后睡覺(jué)。
需要寫(xiě)一個(gè)程序?qū)崿F(xiàn)自動(dòng)備份,然后讓定時(shí)任務(wù)軟件幫你執(zhí)行。
三、如何使用
1)用戶定時(shí)任務(wù)計(jì)劃
cron是定時(shí)任務(wù)的軟件名。
crond是服務(wù)進(jìn)程名,真正實(shí)現(xiàn)定時(shí)任務(wù)服務(wù)。
crontab命令是用來(lái)設(shè)置定時(shí)任務(wù)規(guī)則的配置命令。
要想配置定時(shí)任務(wù),首先啟動(dòng)cron服務(wù)
[root@app1 logrotate.d]# systemctl status crond
● crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2019-06-10 19:56:50 CST; 17min ago
Main PID: 6567 (crond)
CGroup: /system.slice/crond.service
└─6567 /usr/sbin/crond -n
Jun 10 19:56:50 app1 systemd[1]: Started Command Scheduler.
Jun 10 19:56:51 app1 crond[6567]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 36% if used.)
Jun 10 19:56:51 app1 crond[6567]: (CRON) INFO (running with inotify support)
crond服務(wù)命令
systemctl start crond.service
systemctl stop crond.service
systemctl enable crond.service
systemctl disable crond.service
內(nèi)容存放位置/var/spool/cron/
以當(dāng)前用戶名作為文件名
-l 查看已經(jīng)設(shè)置的定時(shí)任務(wù)
-e 編輯定時(shí)任務(wù)
-u 查看特定用戶下定時(shí)任務(wù)
編寫(xiě)定時(shí)任務(wù)的語(yǔ)法
[root@app1 cron]# 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
# | | | | |
# * * * * * command to be executed
共六列:
第一列:分minute (0 - 59)
第二列:時(shí)hour (0 - 23)
第三列:日day of month (1 - 31)
第四列:月month (1 - 12)
第五列:周day of week (0 - 6)
第六列:要執(zhí)行的任務(wù)命令或程序
特殊符號(hào):
- 表示的 每或每一 的意思
00 23 * * * cmd 每天23點(diǎn)00分執(zhí)行任務(wù)
- 連續(xù)區(qū)間 1-10
00 8-23 * * * cmd 每天8點(diǎn)至23點(diǎn),每小時(shí)執(zhí)行任務(wù)
, 列舉 1,2,3,4,8
00 1,2,3,4,8 * * * cmd 每天1點(diǎn)、2點(diǎn)、3點(diǎn)、4點(diǎn)、8點(diǎn)執(zhí)行任務(wù)
/n n是數(shù)字,每隔n單位時(shí)間
*/10 * * * * cmd 每隔10分鐘執(zhí)行一次任務(wù)
30 */6 * * * cmd 每隔6小時(shí)的30分執(zhí)行任務(wù)
30 8-12/2 * * * cmd 每天8點(diǎn)至12點(diǎn),每隔2小時(shí)的30分執(zhí)行任務(wù)
45 4 1,10,22 * * cmd 每月1號(hào)、10號(hào)、22號(hào)4點(diǎn)45分執(zhí)行任務(wù)
10 1 * * 6,0 cmd 每周六周日1點(diǎn)10執(zhí)行任務(wù)
yum install ntpdate
crontab -e
*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com &>/dev/null
日志信息
/var/log/cron
備注:執(zhí)行命令最后編寫(xiě)腳本,由cron調(diào)用腳本執(zhí)行定時(shí)任務(wù)。
2)系統(tǒng)定時(shí)任務(wù)計(jì)劃
[root@app1 logrotate.d]# ll /etc/cron.daily/logrotate /etc/logrotate.conf
-rwx------. 1 root root 219 Oct 31 2018 /etc/cron.daily/logrotate
-rw-r--r--. 1 root root 662 Jul 31 2013 //etc/logrotate.conf
四、定時(shí)任務(wù)書(shū)寫(xiě)要領(lǐng)
1)為定時(shí)任務(wù)添加注釋
2)所有定時(shí)任務(wù)盡量都以腳本的形式執(zhí)行
3)在執(zhí)行的shell腳本前加上/bin/sh
4)定時(shí)任務(wù)中命令或腳本的結(jié)尾加 >/dev/null 2>&1
5)在指定用戶下執(zhí)行相關(guān)定時(shí)任務(wù)
6)生產(chǎn)任務(wù)計(jì)劃程序中不要隨意打印輸出信息,有輸出的法辦法去掉
7)定時(shí)任務(wù)執(zhí)行腳本要存放到規(guī)范路徑下
8)配置定時(shí)任務(wù)要規(guī)范操作過(guò)程,減少出錯(cuò)
9)定時(shí)任務(wù)腳本中程序命令及路徑盡量用全路徑
10)時(shí)間變量%號(hào)要用反斜線轉(zhuǎn)義(只有定時(shí)任務(wù)里時(shí)間命令需要)
11)若腳本中調(diào)用了系統(tǒng)環(huán)境變量,要重新定義
12)出錯(cuò)或無(wú)法執(zhí)行,檢果/var/log/cron日志
五、案例分析
1)環(huán)境變量問(wèn)題
定時(shí)任務(wù)在執(zhí)行腳本的時(shí)候,多數(shù)情況沒(méi)辦法加載環(huán)境變量,特別是/etc/profile。
登陸后測(cè)試成功,但是添加到定時(shí)任務(wù)時(shí)無(wú)法執(zhí)行。
分析:
命令行以bash登陸
手工登陸后,加載所有環(huán)境變量
(/.bash_profile,/.bash_rc,/etc/profile,/etc/bashrc)
定時(shí)任務(wù)執(zhí)行腳本屬于非登陸狀態(tài)
解決:
定時(shí)任務(wù)腳本添加export環(huán)境變量
2)No space left on device故障
磁盤(pán)滿的報(bào)錯(cuò),原因往往是inode被占滿。
df -i
分析:
因?yàn)槎〞r(shí)任務(wù)沒(méi)有加&>/dev/null,定時(shí)任務(wù)執(zhí)行的時(shí)候把輸出給系統(tǒng)root發(fā)郵件。 郵件服務(wù)器postfix服務(wù)默認(rèn)關(guān)閉,所以給系統(tǒng)發(fā)的郵件就會(huì)產(chǎn)生在臨時(shí)目錄(產(chǎn) 生大量小文件)。
cent6 /var/spool/clientmqueue
cent7 /var/spool/postfix/maildrop/