Linux第1个必会服务-定时任务以及邮件发送

一、定时任务

1、概述

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

定时任务:类似于闹钟.

2、服务使用流程

服务使用流程说明
部署安装这个服务软件
配置如何使用这个服务通过配置文件,通过命令。
优化或注意事项安全问题
排障难点: 1、通过错误提示解决 2、学会看日志 3、让服务错误提示或者输出更加详细的错误提示(通过重定向)
其他1、做好备份 2、做好监控 3、做好日志收集 4、统一认证

3、部署定时任务

定时任务软件包名字,服务名字(进程)

[root@yunwei ~]# systemctl status crond
   Active: active (running) since 二 2024-02-06 21:27:53 CST; 5 days ago
[root@yunwei ~]# rpm -qa cronie
cronie-1.4.11-23.el7.x86_64
目录结构说明
/var/spool/cron/用户的定时任务的配置文件的目录
/var/log/cron定时任务日志

检查是否运行

在这里插入图片描述

4、完全使用指南

4.1、配置的命令

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

crontab选项说明
crontab -eedit编辑当前用户的定时任务vi /var/spool/cron/root #root当前用户的名字
crontab -llist查看当前用户的定时任务cat /var/spool/cron/root #root当前用户的名字
[root@yunwei ~]# crontab -e
no crontab for root - using an empty one
crontab: installing new crontab
[root@yunwei ~]# crontab -l
#it is test
4.2、定时任务书写格式-时间

在这里插入图片描述

每天早上8:30分 去学校(go to school)
#1.test01
30 08 * * * go to school
​
晚上12点上床睡觉(go to bed/sleep) 
#2.test02
​
* 00 * * * go to bed #每天的半夜12点00-59 每分钟运行.
00 00 * * * go to bed #每天运行
​
问题:
表示整点的时候,未说明分钟的时候,我们要指定的分钟,一般是00.
4.3、定时任务时间部分的特殊符号
时间部分特殊符号说明案例
/每隔XX时间*/2 * * * * 每两分钟 00 */2 * * * 每两小时
-表示范围00 08-22 * * * 08-22点每小时运行 00 08-22/3 * * * 08-22点每三小时运行
,表示独立时间(没规律)00 08.12.18 * * *
*每,全部/所有(没说具体时间)*在分钟的位置上表示00-59,每分钟 *在小时位置上00-23,每小时的意思

5、定时任务案例

  • 同步时间
  • 进行备份
  • 日常循环操作
  • 巡检+发送邮件

时间+命令格式

5.1、每两分钟同步一下系统时间

使用了什么命令? ntpdate ntp1.aliyun.com

书写定时任务配置文件:

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

尝试修改时间

date -s '20111213'

日志:这个定时任务是否运行

定时任务日志只能提示是否运行了,但是无法告诉我们是否运行成功.

在这里插入图片描述

遇到,小bug:同步时间时报错the NTP socket is in use, exiting

在这里插入图片描述

原因分析:报错的原因是系统ntpd服务器正在运行中,通过以下命令查看ntpd是否在运行。

ps -ef | grep ntpd

解决办法:由于ntpd在运行,要解决此问题只要关闭ntpd即可解决

systemctl stop ntpd
5.2、每天定时备份/etc/到/backup/下面

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

  • 命令:tar命令
  • 脚本:命令大礼包.sh结尾 .bash结尾
  • 定时任务配置:(每分钟运行)
  • 调试完成改为要求的时间
#1、创建目录
mkdir -p /server/scripts
​
#2、脚本
cat backup-etc.sh
tar zcf /backup/etc-`date +%F_%w`.tar.gz /etc/
​
#3、测试执行
sh backup-etc.sh
​
#4、定时任务
crontab -e
00 01 * * * /usr/bin/sh /server/scripts/backup-etc.sh
5.3、脚本与变量(脚本深入)

变量与命令(命令中如何使用变量)

创建以时间命名的文件oldboy-时间.txt 
time=`date +%F_%w`
touch oldboy-$time.txt

在脚本中使用变量

[root@yunwei ~]# cat /server/scripts/backup-etc-var.sh
#!/bin/bash
##定义变量
time=`date +%F_%w_%H`#引用变量-备份
tar zcf /backup/etc-${time}.tar.gz /etc/

在这里插入图片描述

设置时间秒,但是执行没有变化原因。

瞬时变量并且直接记录

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

2.1、增加注释

书写定时任务的时候,尽量添加上一个注释.

用于说明这条定时任务作用.

2.2、尽量使用脚本

定时任务未来避免一些故障,推荐使用脚本.

调试脚本的方法:

sh -x 或bash -x ,显示脚本执行过程.

  • 有+开头的表示脚本背后执行的过程.
  • 如果开头没有+,表示输出.
[root@yunwei scripts]# sh -x backup-etc.sh 
++ date +%F_%w
+ tar zcf /backup/etc-2024-02-12_1.tar.gz /etc/
tar: 从成员名中删除开头的“/”

2.3、定时任务的文件,脚本使用绝对路径

书写定时任务的时候,相关文件要使用绝对路径.

/server/scripts/backup-etc.sh

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

只要不在这些目录下面的命令,就要使用绝对路径或者重新定义下PATH环境变量(source /etc/profile)

PATH是临时的环境变量,只要断开连接重连就可以恢复

[root@yunwei ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/python-3.8.6/bin:/root/bin
[root@yunwei ~]# PATH='1'
[root@yunwei ~]# ls
-bash: ls: 未找到命令
[root@yunwei ~]# mv
-bash: mv: 未找到命令
[root@yunwei ~]# 
连接断开
连接主机...
连接主机成功
[root@nanjing ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/python-3.8.6/bin:/root/bin

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

#定向到空
#1、同步时间 by author at 20221111
*/2 * * * * /sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1
#2、追加到文件
* * * * * echo shishuwu >>/tmp/test.txt 2>&1

三、定时任务故障案例

3.1、定时任务直接书写的时候%有特殊含义

  • %回车
  • 去掉特殊含义需要使用 \

如果使用脚本,就没有这个问题了

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

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

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

故障案例:

现象:命令行执行命令或脚本是成功的,交到了定时任务中执行,提示命令找不到.

原因:定时任务运行脚本的时候或命令的时候,只能识别/bin和/usr/bin目录下面的命令,其他的命令无法识别

解决方案:

  • A:简单粗暴,遇到这种命令,直接写绝对路径
  • B:治本,在脚本开头重新定义下PATH环境变量或重新加载下PATH环境变量

使用方案A

[root@yunwei sh]# cat nousePATH.sh 
#!/bin/bash
/usr/sbin/ip a s eth0

使用方案B

1、重新加载PATH变量(常用)

[root@yunwei sh]# cat usePATH.sh 
#!/bin/bash
source /etc/profile
ip a s eth0

2、声明PATH变量

[root@yunwei sh]# cat usePATH.sh 
#!/bin/bash
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/python-3.8.6/bin:/root/bin
ip a s eth0

报错截图

在这里插入图片描述

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

Linux注明的黑洞和白洞:

黑洞 /dev/null放在里面的文件默认抛弃

白洞 /dev/zero 不断吐出字符

[root@yunwei ~]# ll /dev/null /dev/zero
crw-rw-rw- 1 root root 1, 3 212 20:27 /dev/null
crw-rw-rw- 1 root root 1, 5 212 20:27 /dev/zero

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

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

原因:

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

解决:

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

通过我的观察,云服务器厂商的镜像默认关闭postfix邮件服务

四、使用案例

4.1、定时备份/etc/目录到/backup以ip地址命名的目录中

#获取服务器IP 
#hostname -I 输出后面有空格
[root@yunwei ~]# hostname -I|  awk '{print$1}'
10.0.0.2
#获取服务器时间
#[root@yunwei sh]# date +%F_%w
2024-02-12_1

脚本如下:

[root@yunwei ~]# cat /sh/backup-ip.sh 
#!/bin/bash
#source /etc/profiledir=/backup/
ip=`hostname -I | awk '{print $1}'`
time=`date +%F_%w`
backup_dir=${dir}${ip}mkdir -p ${backup_dir}
tar zcf ${backup_dir}/etc-${time}.tar.gz  /etc/

定时任务

00 01 * * * /usr/bin/sh /sh/backup-ip.sh >>/tmp/ip.log 2>&1

#小坑指南
因为空格造成的bug(反复排查到最不可能的ip表达式)

错误发生点:

因为第一个表达式前面有空格,导致创建文件有问题

[root@yunwei~]# ip a s eth0 | awk -F'inet|/' 'NR==3{print$2}'
 10.0.0.2
#下面是正确写法
[root@yunwei ~]# ip a s eth0 | awk -F'inet|/' 'NR==3{print$2}' | awk '{print$1}'
10.0.0.2
[root@yunwei ~]# ip a s eth0 | awk -F'inet |/' 'NR==3{print$2}'
10.0.0.2
[root@yunwei ~]# hostname -I|  awk '{print$1}'
10.0.0.2
  • 查缺补漏1:

这个命令为什么没有输出?——》引申出对-F的用法不精确

这表示 awk 应该将 “inet”、“/” 和空格都视为分隔符。但是,如果您的输入中 “inet” 和 “/” 之间有空格,那么 awk 将会将空格作为分隔符,而不会识别 “inet” 和 “/” 作为单独的单词。

[root@yunwei ~]# echo "inet 192.168.1.1/24" | awk -F'[inet/ ]' '{print $3}'[root@yunwei ~]# 

正确写法:以inet和/为分隔号。

[root@yunwei ~]# echo "inet 192.168.1.1/24" | awk -F'inet |/' '{print $2}'
192.168.1.1
  • 查缺补漏2:

脚本中变量表达方式

ip=`ip a`echo ${ip}

4.2、定时系统巡检(定时输出系统基本信息)写入到/tmp/sys.tog中

通过手动或自动方式,获取所有主机的基本信息.

未来这个操作可以通过监控实现.

#!/bin/bash
source /etc/profile
​
#变量
hostname=`hostname`
ip=`hostname -I`load1min=`uptime | awk -F'[ ,]+' '{print $NF}'`
load5min=`uptime | awk -F'[ ,]+' '{print $(NF-1)}'`
load15min=`uptime | awk -F'[ ,]+' '{print $(NF-2)}'`free=`free | awk  'NR==2{print$2}'`
usefree=`free | awk 'NR==2{print($3+$6)}'`
use=`free | awk 'NR==2{print($3+$6)/$2*100"%"}'`swap=`free | awk 'NR==3{print$2}'`
useswap=`free | awk  'NR==3{print$3}'`num=`ls /dev/ | grep vd[a-z]$ | wc -l`
useblk=`df -h | awk '$NF=="/"' | awk '{print $(NF-1)}'`
allblk=`df -h | awk '$NF=="/"' | awk '{print $2}'`process_total=`top -bn1| awk 'NR==2{print $2}'`
process_run=`top -bn1| awk 'NR==2{print $4}'`
process_stop=`top -bn1| awk 'NR==2{print $8}'`
process_zombie=`top -bn1| awk 'NR==2{print $10}'`#输出
echo "#################################"
echo "主机名: ${hostname} "
echo "ip地址: ${ip}"
echo "#################################"
echo "负载信息"
echo "最近1分钟: ${load1min}"
echo "最近5分钟: ${load5min}"
echo "最近15分钟: ${load15min}"
echo "#################################"
echo "内存信息(单位kb)"
echo "总计内存: ${free}"
echo "内存使用了多少:${usefree}"
echo "内存使用率: ${use}"
echo "#################################"
echo "swap信息"
echo "swap总大小: ${swap}"
echo "swap使用大小: ${useswap}"
echo "#################################"
echo "磁盘信息"
echo "几块硬盘: ${num}"
echo "根分区大小: ${allblk}"
echo "根分区使用率: ${useblk}"
echo "#################################"
echo "进程信息"
echo "进程总数: ${process_total}"
echo "运行中进程: ${process_run}"
echo "挂起进程数量: ${process_stop}"
echo "僵尸进程数量: ${process_zombie}"
echo "#################################"

临时更改编码,无中文

export LANG=en_US.UTF-8

在这里插入图片描述

4.3、发送邮件

.邮件,最简单的一种发送方式
1.配置发件人:163邮箱
获取:授权码(用户密码)
linux配置 /etc/mail.rc
完成
2.发件人:qq
通过命令发送
3.配置发件人
获取授权码

在这里插入图片描述

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

cat >>/etc/mail.rc <<EOF
#以加密的465端口
set nss-config-dir=/etc/pki/nssdb
set smtp-user-starttls
set ssl-verify=ignore
#配置发件人
set from=li@163.com
#加密465端口
set smtp=smtps://smtp.163.com:465
#邮箱名字
set smtp-auth-user=li@163.com
#授权码
set smtp-auth-password=aaaa
set smtp-auth=login

#下面3行用于配置加密方式进行传输
set nss-config-dir=/etc/pki/nssdb/
set smtp-user-starttls
set ssl-verify=ignore
EOF

在这里插入图片描述

虽然有报错,但是目的端也是能收到邮件的。

解决方案:

echo -n | openssl s_client -connect smtp.163.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /etc/pki/nssdb/163.crt
certutil -A -n "GeoTrust SSL CA" -t "C,," -d /etc/pki/nssdb/ -i /etc/pki/nssdb/163.crt
certutil -A -n "GeoTrust Global CA" -t "C,," -d /etc/pki/nssdb/ -i /etc/pki/nssdb/163.crt
certutil -L -d /etc/pki/nssdb/
cd /etc/pki/nssdb/
certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu" -d ./ -i 163.crt

两种发送邮件的方式

mail -s '你的网站巡检信息' 123456789@qq.com < mail.txt
echo '你的网站巡检信息在附件' | mail -s "巡检结果" -a  mail.txt 999@qq.com
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值