定时任务及发送邮件

定时任务,用于执行在Linux中的重复性工作。如:命令(同步系统时间),脚本(备份,系统巡检)。

服务使用流程:

部署;

配置,如何使用这个服务通过配置文件,通过命令,初级使用:能用就行;提高:额外的配置;

优化或注意事项:安全......

排障:难点;1,通过错误提示解决,2,学会去看日志;3,高级:让服务输出错误提示或输出更加详细的错误提示(通过重定向);

其他:1,做好监控,2,做好备份,3,做好日志收集;4,统一认证;

======================================================================

概述:

定时任务软件包名字:cronie,服务名字(进程)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

----------------------------------------------------------------------------------------------------------

目录结构:

rpm -ql cronie

/etc/cron.d

/etc/cron.d/0hourly

/etc/cron.deny

/etc/pam.d/crond //这几个不用管

用户的配置文件的目录:

/var/spool/cron  //用户的定时任务的配置文件的目录


/etc/crontab //不推荐使用这个,系统定时任务的配置文件

比如:

/var/spool/cron/mclind

用crontab这个命令来编辑这个目录文件

日志文件:/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 //系统定时任务,每天运行

-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  //系统定时任务,每小时运行

drwxr-xr-x. 2 root root 6 6月 10 2014 /etc/cron.monthly //系统定时任务,每小时运行

drwxr-xr-x. 2 root root 6 6月 10 2014 /etc/cron.weekly //系统定时任务,每周运行

======================================================================

使用指南

检查是否运行、开机自启动

# systemctl status crond

============

crontab用于定时任务的规则进行增删改查。

选项:

-e:编辑当前用户的定时任务,相当于在vi /var/spool/cron/root(root为当前用户名);

-l:查看当前用户的定时任务,相当于在cat /var/spool/cron/root(root为当前用户名);

-u:指定用户名;

-r:清空当前用户的定时任务;无提示;

-i:清空定时任务之前作提示;

输入crontab -e,即可进入编辑模式,和vim类似;

格式:

* * * * * 命令

分 时 日 月 周 comand to be executed

分:0-59

时:0-23

日:1-31

月:1-12

周:0-6,0或7都代表周日,1-6代表周一到周六;

======================================================================

案例:每天早上8:30分,去学校

#1,test01 //这是注释

30 8 * * * go to school

晚上12点上床睡觉

* 00 * * * go to bed

00 00 * * * go to bed

//这两种有什么区别?

//第一种,每天的半夜12点,每分钟都go to bed;

//第二种,每天半夜12点,00分,go to bed一次;

//综上,涉及到小时,天,周几的时候,分钟位置上记得写个数(比如00),多少都行;

----------------------------------------------------------------------------------------------------------

定时任务部分的特殊符号:

/:斜线,每隔XX时间,比如:*/2 * * * *,每2分种;

-:减号,表示范围,比如:00 8-18/2 * * *,8点到晚上18点期间每2个小时;

,:逗号,独立的一些时间,比如:00 8,9,12,14,18 * * *,8,9,12,14,18点,只有这几个;适用于没规律的时候;

----------------------------------------------------------------------------------------------------------

接着找案例:

每天早7点到晚11点,每2个小时运行cmd命令

00 07-23/2 * * * CMD

1)每2分钟同步系统时间,命令要使用绝对路径,输出清空:

*/2 * * * * /sbin/ntpdate ntp1.aliyun.com &>/dev/null

写好之后要调试(测试,检查 )(这里可以先修改一下时间,看能否同步)(date -s '20221111 11:11:11'

1,日志:看是否运行(定时任务日志,只能提示是否运行了,但无法告知是否成功,tail -f /var/log/cron);

2,结果:查看定时任务的结果(时间是否修改,压缩包是否生成);

----------------------------------------------------------------------------------------------------------

为什么要用crontab -e编辑定时任务,而不是直接编辑文件呢?因为crontab -e,在保存时候,还有语法检查的功能;

定时任务书写流程:

1,分析要求需要使用什么命令并调试;

2,书写脚本(命令较多,功能复杂)与调试;

3,书写定时任务的配置文件(绝对路径,定向到空)

4,调试;

======================================================================

案例:02,每天定时备份/etc/到/backup/下面

备份时间:业务低谷期,比如凌晨1点备份;

命令:tar命令;

脚本:命令大礼包 .sh .bash结尾;

定时任务配置:

命令:

mkdir -p /backup/ //这只用创建一次

tar zcf /backup/etc-`date +%F`.tar.gz /etc/

脚本:

专用脚本目录:(自己规划,备份放哪,脚本放哪,软件包放哪)

mkdir -p /server/scripts

cd /server/scripts

vim backup-etc.sh //名字,建议见名知义

以下是脚本内容:

tar zcf /backup/etc-`date +%F`.tar.gz /etc/

脚本内容完毕,对,只有这一行,就是上面执行的一行;

sh /server/scripts/backup-etc.sh //执行脚本

书定定时任务:

#2,这是一个定时备份/etc/目录任务,by root at Xxxx

00 01 * * * /bin/sh /server/scripts/backup-etc.s >/dev/null 2>&1

//一开始测试,可以设置频率高一点,比如每分钟,没问题了,可以设置正常要求时间;

tail -f /var/log/cron //查看日志检查

watch ls -l //watch,每2秒运行一下命令,这就是方便检查,不用一次交敲命令

======================================================================

脚本与变量:

变量,可以改变的量,在脚本中可以重复使用;

a = 'asdf'

echo $a //变量取值

dir=/server/scripts/

file=backup-etc.sh

echo $dir$file

脚本开头:建议加上#!/bin/bash,这是一个说明;

对以上脚本改写:

#脚本开始

#!/bin/bash

#定义变量

time=`date +%F_%w`

tar zcf /backup/etc/-$time.tar.gz /etc/

#至此脚本改完;;

======================================================================

======================================================================

定时任务注意事项(箴言)

1)增加注释;

2)尽量使用脚本;

3)定时任务的文件,脚本使用绝对路径;

4)命令使用绝对路径;

5)定时任务中执行的命令或脚本定向到空或追加到文件;

==========================

定时任务关于命令路径的故障:

现在:手动执行或脚本执行是好的,但放定时任务就提示命令不存在;command not found/no such file or directory

在定时任务运行命令或脚本的时候,只能识别到/bin或者/usr/bin目录下面的命令;

只要不在这些目录下面的命令,就要使用绝对路径或者重新定义下PATH;

PATH,Linux环境变量,存放命令的位置(路径),以冒号:分隔;查看命令:echo $PATH;

解决方案:

使用绝对路径,或者在脚本开头,重新加载PATH变量;

======================================================================

脚本中重新加载PATH

#!/usr/bin

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin //重新定义

source /etc/profile //重新加载PATH环境变量,这两种都可以,source也可以写成.

ip a s eth0

ifconfig eth0

======================================================================

定时任务没有定向到空或追加到文件故障案例

现象:

邮件服务开启: 不断收到邮箱 You have new mail in /var/spool/mail/root

邮件服务关闭: 一些邮件的临时目录不断堆积小文件. /var/spool/postfix/maildrop

原因:

定时任务运行命令或脚本的时候,命令或脚本有输出,定时任务就会通过邮件形式发送给root.

解决:

定时任务中命令或脚本定向到空或追加到文件.

#定向到空

#1. 同步时间

*/2 * * * * /sbin/ntpdate ntp1.aliyun.com

#追加到文件

#4. echo

* * * * * echo hello >> /tmp/lidao.txt 2>&1

#2. 定时备份 /etc/ 目录

00 01 * * * /bin/sh -x /server/scripts/backup-etc.sh &>> /tmp/script.log

======================================================================

案例:用脚本(使用变量)定时备份 /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/

//至此,脚本写完,下面写定时任务 ,命令行输入crontab -e开始:

# 备份/etc/目录,by mclind 20230101

00 00 * * * /usr/bin/sh /server/script/backup.sh >>/dev/null 2>&1

//书写完毕,搞定

======================================================================

发送邮件:在Linux上,找一个源邮箱,发给目标邮箱。

步骤:

1、先找源邮箱的授权码,并打开SMTP,以126邮箱为例:

        登录邮箱,找到  “设置”,打开  “POP3/SMTP/IMAP”  ,开启服务哪里,开启IMAP/SMTP服务和POP3/SMTP服务,默认是关闭的,开启需要手机发送一条短信;

2、配置linux mail.rc配置发件人信息

        # vim /etc/mail.rc #下面内容写到最后

set nss-config-dir=/etc/pki/nssdb/

set smtp-user-starttls

set ssl-verify=ignore

set from=username@126.com  //配置发件人

set smtp=smtps://smtp.126.com:465  //配置使用126发送邮件

set smtp-auth-user=username@126.com  //用户名,邮箱名字,如果

set smtp-auth-password=KNDDCBTLVJISZJGN  //授权码

set smtp-auth=login  //认证形式login

set nss-config-dir=/etc/pki/nssdb/  //这3行用于配置加密方式传输,不加密方式不用配

set smtp-user-starttls //这3行用于配置加密方式传输,不加密方式不用配

set ssl-verify=ignore //这3行用于配置加密方式传输,不加密方式不用配

//内容写完了,接着就可以发送邮件测试了

# mail -s 'test' 2312823999@qq.com < haha.txt //这是发邮件命令,但会有一个错误提示:从下一行开始

//Error in certificate: Peer's certificate issuer has been marked as not trusted by the.

//这个,是配置加密方式发送邮件错误,因为加密,所以需要认证,传输时候缺少文件或证书认证,就报错了。

下面附上解决方法,就是执行下面内容即可(在命令行直接粘贴执行也可以,放shell脚本执行也可以)

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

//至此,解决方案的命令完,再次发送邮件,就不会报错了,

----------------------------------------------------------------------------------------------------------

如果发邮件想要附上附件,也可以加参数-a

# mail -s 'test' -a haha.txt 2312823999@qq.com < haha.txt

----------------------------------------------------------------------------------------------------------

上面配置的是加密发邮件,也可以不用加密码方式:

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

======================================================================

脚本如何输出表格?一般用开发语言生成,这里我不会,就用csv格式糊弄一下了~~

在脚本里,用echo输出到表格,但有一点,输出格式需要调一下;

echo "主机名,${hostname}"  //在echo输出的语句里,用逗号分隔,就形成了csv格式文件,这就是一行

echo "IP,${ip}"  // 这是另一行,这里只能输出内容,没有excel里边的函数等功能

//下面就不写了,就这俩测试一下看看就可以了。

# sh /server/script/csvtest.sh > test.csv  //这就生成了,可以拉到windows下使用查看

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容