定時(shí)任務(wù)及發(fā)送郵件

定時(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下使用查看

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容