定時(shí)任務(wù),用于執(zhí)行在Linux中的重復(fù)性工作。如:命令(同步系統(tǒng)時(shí)間),腳本(備份,系統(tǒng)巡檢)。
服務(wù)使用流程:
部署;
配置,如何使用這個(gè)服務(wù)通過配置文件,通過命令,初級使用:能用就行;提高:額外的配置;
優(yōu)化或注意事項(xiàng):安全......
排障:難點(diǎn);1,通過錯(cuò)誤提示解決,2,學(xué)會去看日志;3,高級:讓服務(wù)輸出錯(cuò)誤提示或輸出更加詳細(xì)的錯(cuò)誤提示(通過重定向);
其他:1,做好監(jiān)控,2,做好備份,3,做好日志收集;4,統(tǒng)一認(rèn)證;
======================================================================
概述:
定時(shí)任務(wù)軟件包名字:cronie,服務(wù)名字(進(jìn)程)crond:
[root@web01 ~]# rpm -qa cronie
cronie-1.4.11-23.el7.x86_64
# rpm -ql 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
----------------------------------------------------------------------------------------------------------
目錄結(jié)構(gòu):
rpm -ql cronie
/etc/cron.d
/etc/cron.d/0hourly
/etc/cron.deny
/etc/pam.d/crond //這幾個(gè)不用管
用戶的配置文件的目錄:
/var/spool/cron? //用戶的定時(shí)任務(wù)的配置文件的目錄
/etc/crontab //不推薦使用這個(gè),系統(tǒng)定時(shí)任務(wù)的配置文件
比如:
/var/spool/cron/mclind
用crontab這個(gè)命令來編輯這個(gè)目錄文件
日志文件:/var/log/cron
可以了解下面的配置文件:
[root@web01 ~]# ls -ld /etc/cron.*
drwxr-xr-x. 2 root root 36 12月 7 19:34 /etc/cron.d??
drwxr-xr-x. 2 root root 42 12月 6 07:41 /etc/cron.daily //系統(tǒng)定時(shí)任務(wù),每天運(yùn)行
-rw-------. 1 root root 0 8月 9 2019 /etc/cron.deny
drwxr-xr-x. 2 root root 22 12月 6 07:41 /etc/cron.hourly? //系統(tǒng)定時(shí)任務(wù),每小時(shí)運(yùn)行
drwxr-xr-x. 2 root root 6 6月 10 2014 /etc/cron.monthly?//系統(tǒng)定時(shí)任務(wù),每小時(shí)運(yùn)行
drwxr-xr-x. 2 root root 6 6月 10 2014 /etc/cron.weekly?//系統(tǒng)定時(shí)任務(wù),每周運(yùn)行
======================================================================
使用指南
檢查是否運(yùn)行、開機(jī)自啟動
# systemctl status crond
============
crontab用于定時(shí)任務(wù)的規(guī)則進(jìn)行增刪改查。
選項(xiàng):
-e:編輯當(dāng)前用戶的定時(shí)任務(wù),相當(dāng)于在vi /var/spool/cron/root(root為當(dāng)前用戶名);
-l:查看當(dāng)前用戶的定時(shí)任務(wù),相當(dāng)于在cat /var/spool/cron/root(root為當(dāng)前用戶名);
-u:指定用戶名;
-r:清空當(dāng)前用戶的定時(shí)任務(wù);無提示;
-i:清空定時(shí)任務(wù)之前作提示;
輸入crontab -e,即可進(jìn)入編輯模式,和vim類似;
格式:
* * * * * 命令
分 時(shí) 日 月 周 comand to be executed
分:0-59
時(shí):0-23
日:1-31
月:1-12
周:0-6,0或7都代表周日,1-6代表周一到周六;
======================================================================
案例:每天早上8:30分,去學(xué)校
#1,test01 //這是注釋
30 8 * * * go to school
晚上12點(diǎn)上床睡覺
* 00 * * * go to bed
00 00 * * * go to bed
//這兩種有什么區(qū)別?
//第一種,每天的半夜12點(diǎn),每分鐘都go to bed;
//第二種,每天半夜12點(diǎn),00分,go to bed一次;
//綜上,涉及到小時(shí),天,周幾的時(shí)候,分鐘位置上記得寫個(gè)數(shù)(比如00),多少都行;
----------------------------------------------------------------------------------------------------------
定時(shí)任務(wù)部分的特殊符號:
/:斜線,每隔XX時(shí)間,比如:*/2 * * * *,每2分種;
-:減號,表示范圍,比如:00 8-18/2 * * *,8點(diǎn)到晚上18點(diǎn)期間每2個(gè)小時(shí);
,:逗號,獨(dú)立的一些時(shí)間,比如:00 8,9,12,14,18 * * *,8,9,12,14,18點(diǎn),只有這幾個(gè);適用于沒規(guī)律的時(shí)候;
----------------------------------------------------------------------------------------------------------
接著找案例:
每天早7點(diǎn)到晚11點(diǎn),每2個(gè)小時(shí)運(yùn)行cmd命令
00 07-23/2 * * * CMD
1)每2分鐘同步系統(tǒng)時(shí)間,命令要使用絕對路徑,輸出清空:
*/2 * * * * /sbin/ntpdate ntp1.aliyun.com &>/dev/null
寫好之后要調(diào)試(測試,檢查 )(這里可以先修改一下時(shí)間,看能否同步)(date -s '20221111 11:11:11'
1,日志:看是否運(yùn)行(定時(shí)任務(wù)日志,只能提示是否運(yùn)行了,但無法告知是否成功,tail -f /var/log/cron);
2,結(jié)果:查看定時(shí)任務(wù)的結(jié)果(時(shí)間是否修改,壓縮包是否生成);
----------------------------------------------------------------------------------------------------------
為什么要用crontab -e編輯定時(shí)任務(wù),而不是直接編輯文件呢?因?yàn)閏rontab -e,在保存時(shí)候,還有語法檢查的功能;
定時(shí)任務(wù)書寫流程:
1,分析要求需要使用什么命令并調(diào)試;
2,書寫腳本(命令較多,功能復(fù)雜)與調(diào)試;
3,書寫定時(shí)任務(wù)的配置文件(絕對路徑,定向到空)
4,調(diào)試;
======================================================================
案例:02,每天定時(shí)備份/etc/到/backup/下面
備份時(shí)間:業(yè)務(wù)低谷期,比如凌晨1點(diǎn)備份;
命令:tar命令;
腳本:命令大禮包 .sh .bash結(jié)尾;
定時(shí)任務(wù)配置:
命令:
mkdir -p /backup/ //這只用創(chuàng)建一次
tar zcf /backup/etc-`date +%F`.tar.gz /etc/
腳本:
專用腳本目錄:(自己規(guī)劃,備份放哪,腳本放哪,軟件包放哪)
mkdir -p /server/scripts
cd /server/scripts
vim backup-etc.sh //名字,建議見名知義
以下是腳本內(nèi)容:
tar zcf /backup/etc-`date +%F`.tar.gz /etc/
腳本內(nèi)容完畢,對,只有這一行,就是上面執(zhí)行的一行;
sh /server/scripts/backup-etc.sh //執(zhí)行腳本
書定定時(shí)任務(wù):
#2,這是一個(gè)定時(shí)備份/etc/目錄任務(wù),by root at Xxxx
00 01 * * * /bin/sh /server/scripts/backup-etc.s >/dev/null 2>&1
//一開始測試,可以設(shè)置頻率高一點(diǎn),比如每分鐘,沒問題了,可以設(shè)置正常要求時(shí)間;
tail -f /var/log/cron //查看日志檢查
watch ls -l //watch,每2秒運(yùn)行一下命令,這就是方便檢查,不用一次交敲命令
======================================================================
腳本與變量:
變量,可以改變的量,在腳本中可以重復(fù)使用;
a = 'asdf'
echo $a //變量取值
dir=/server/scripts/
file=backup-etc.sh
echo $dir$file
腳本開頭:建議加上#!/bin/bash,這是一個(gè)說明;
對以上腳本改寫:
#腳本開始
#!/bin/bash
#定義變量
time=`date +%F_%w`
tar zcf /backup/etc/-$time.tar.gz /etc/
#至此腳本改完;;
======================================================================
======================================================================
定時(shí)任務(wù)注意事項(xiàng)(箴言)
1)增加注釋;
2)盡量使用腳本;
3)定時(shí)任務(wù)的文件,腳本使用絕對路徑;
4)命令使用絕對路徑;
5)定時(shí)任務(wù)中執(zhí)行的命令或腳本定向到空或追加到文件;
==========================
定時(shí)任務(wù)關(guān)于命令路徑的故障:
現(xiàn)在:手動執(zhí)行或腳本執(zhí)行是好的,但放定時(shí)任務(wù)就提示命令不存在;command not found/no such file or directory
在定時(shí)任務(wù)運(yùn)行命令或腳本的時(shí)候,只能識別到/bin或者/usr/bin目錄下面的命令;
只要不在這些目錄下面的命令,就要使用絕對路徑或者重新定義下PATH;
PATH,Linux環(huán)境變量,存放命令的位置(路徑),以冒號:分隔;查看命令:echo $PATH;
解決方案:
使用絕對路徑,或者在腳本開頭,重新加載PATH變量;
======================================================================
腳本中重新加載PATH
#!/usr/bin
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin //重新定義
source /etc/profile //重新加載PATH環(huán)境變量,這兩種都可以,source也可以寫成.
ip a s eth0
ifconfig eth0
======================================================================
定時(shí)任務(wù)沒有定向到空或追加到文件故障案例
現(xiàn)象:
郵件服務(wù)開啟: 不斷收到郵箱 You have new mail in /var/spool/mail/root
郵件服務(wù)關(guān)閉: 一些郵件的臨時(shí)目錄不斷堆積小文件. /var/spool/postfix/maildrop
原因:
定時(shí)任務(wù)運(yùn)行命令或腳本的時(shí)候,命令或腳本有輸出,定時(shí)任務(wù)就會通過郵件形式發(fā)送給root.
解決:
定時(shí)任務(wù)中命令或腳本定向到空或追加到文件.
#定向到空
#1. 同步時(shí)間
*/2 * * * * /sbin/ntpdate ntp1.aliyun.com
#追加到文件
#4. echo
* * * * * echo hello >> /tmp/lidao.txt 2>&1
#2. 定時(shí)備份 /etc/ 目錄
00 01 * * * /bin/sh -x /server/scripts/backup-etc.sh &>> /tmp/script.log
======================================================================
案例:用腳本(使用變量)定時(shí)備份 /etc/ 目錄
# cat backup-v1.sh
#!/bin/bash
#author: mclind
#desc: backup etc add ip
#version: v1
#變量
ip=`hostname -I | awk '{print $1}'`
time=`date +%F_%w`
#dir=/backup/$ip
#full_file=$dir/etc-$time.tar.gz
#操作
mkdir -p /backup/$ip
tar zcf /backup/$ip/etc-$time.tar.gz /etc/
//至此,腳本寫完,下面寫定時(shí)任務(wù) ,命令行輸入crontab -e開始:
# 備份/etc/目錄,by mclind 20230101
00 00 * * * /usr/bin/sh /server/script/backup.sh >>/dev/null 2>&1
//書寫完畢,搞定
======================================================================
發(fā)送郵件:在Linux上,找一個(gè)源郵箱,發(fā)給目標(biāo)郵箱。
步驟:
1、先找源郵箱的授權(quán)碼,并打開SMTP,以126郵箱為例:
? ? ? ? 登錄郵箱,找到? “設(shè)置”,打開? “POP3/SMTP/IMAP”? ,開啟服務(wù)哪里,開啟IMAP/SMTP服務(wù)和POP3/SMTP服務(wù),默認(rèn)是關(guān)閉的,開啟需要手機(jī)發(fā)送一條短信;
2、配置linux mail.rc配置發(fā)件人信息
? ? ? ? # vim /etc/mail.rc #下面內(nèi)容寫到最后
set nss-config-dir=/etc/pki/nssdb/
set smtp-user-starttls
set ssl-verify=ignore
set from=username@126.com? //配置發(fā)件人
set smtp=smtps://smtp.126.com:465? //配置使用126發(fā)送郵件
set smtp-auth-user=username@126.com? //用戶名,郵箱名字,如果
set smtp-auth-password=KNDDCBTLVJISZJGN? //授權(quán)碼
set smtp-auth=login? //認(rèn)證形式login
set nss-config-dir=/etc/pki/nssdb/? //這3行用于配置加密方式傳輸,不加密方式不用配
set smtp-user-starttls?//這3行用于配置加密方式傳輸,不加密方式不用配
set ssl-verify=ignore?//這3行用于配置加密方式傳輸,不加密方式不用配
//內(nèi)容寫完了,接著就可以發(fā)送郵件測試了
# mail -s 'test' 2312823999@qq.com < haha.txt //這是發(fā)郵件命令,但會有一個(gè)錯(cuò)誤提示:從下一行開始
//Error in certificate: Peer's certificate issuer has been marked as not trusted by the.
//這個(gè),是配置加密方式發(fā)送郵件錯(cuò)誤,因?yàn)榧用?,所以需要認(rèn)證,傳輸時(shí)候缺少文件或證書認(rèn)證,就報(bào)錯(cuò)了。
下面附上解決方法,就是執(zhí)行下面內(nèi)容即可(在命令行直接粘貼執(zhí)行也可以,放shell腳本執(zhí)行也可以)
echo -n | openssl s_client -connect smtp.126.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /etc/pki/nssdb/126.crt
certutil -A -n "GeoTrust SSL CA" -t "C,," -d /etc/pki/nssdb/ -i /etc/pki/nssdb/126.crt
certutil -A -n "GeoTrust Global CA" -t "C,," -d /etc/pki/nssdb/ -i /etc/pki/nssdb/126.crt
certutil -L -d /etc/pki/nssdb/
cd /etc/pki/nssdb/
certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu" -d ./ -i 126.crt
//至此,解決方案的命令完,再次發(fā)送郵件,就不會報(bào)錯(cuò)了,
----------------------------------------------------------------------------------------------------------
如果發(fā)郵件想要附上附件,也可以加參數(shù)-a
# mail -s 'test' -a haha.txt 2312823999@qq.com < haha.txt
----------------------------------------------------------------------------------------------------------
上面配置的是加密發(fā)郵件,也可以不用加密碼方式:
set from=username@163.com
set smtp=smtp.163.com
set smtp-auth-user=username@163.com
set smtp-auth-password=BGRCTL CZXIT
set smtp-auth=login
======================================================================
腳本如何輸出表格?一般用開發(fā)語言生成,這里我不會,就用csv格式糊弄一下了~~
在腳本里,用echo輸出到表格,但有一點(diǎn),輸出格式需要調(diào)一下;
echo "主機(jī)名,${hostname}"? //在echo輸出的語句里,用逗號分隔,就形成了csv格式文件,這就是一行
echo "IP,${ip}"? // 這是另一行,這里只能輸出內(nèi)容,沒有excel里邊的函數(shù)等功能
//下面就不寫了,就這倆測試一下看看就可以了。
# sh /server/script/csvtest.sh > test.csv? //這就生成了,可以拉到windows下使用查看