1.定时任务注意事项(箴言)
1.1.增加注释
书写定时任务的时候,尽量添加上一个注释.
用于说明这条定时任务作用.
1.2.尽量使用脚本
定时任务未来避免一些故障,推荐使用脚本.
调试脚本的方法:
sh -x 或bash -x ,显示脚本执行过程.
有+开头的表示脚本背后执行的过程.
如果开头没有+,表示输出.
[root@myvps scripts]# sh -x backup-conf-v2.sh + backup_dir=/backup/ ++ date +%F_%w + time=2025-03-13_4 + tar zcf /backup//etc-2025-03-13_4.tar.gz /etc/ tar: 从成员名中删除开头的“/” 您在 /var/spool/mail/root 中有新邮件
1.3.定时任务的文件,脚本使用绝对路径
- 书写定时任务的时候,相关文件要使用绝对路径.
/server/scripts/backup-etc.sh
1.4.命令使用绝对路径?
-
定时任务中直接写命令,可以加上绝对路径. 参考2.2-2) 方案🅰️
-
定时任务中运行脚本,脚本开头可以重新设置PATH环境变量. 参考2.2-2) 方案🅱️
1.5.定时任务中执行的命令或脚本定向到空或追加到文件
.定时任务直接书写的时候%有特殊含义#定向到空
#1. 同步时间 by lidao996 at 20221111
*/2 * * * * /sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1#追加到文件
#4. echo
* * * * * echo oldboy >> /tmp/lidao.txt 2>&1
#2. 定时备份 /etc/ 目录 by lidao996 at xxxx
00 01 * * * /bin/sh -x /server/scripts/backup-etc.sh >> /tmp/script.log 2>&1
2.定时任务故障案例
2.1.定时任务直接书写的时候%有特殊含义
- %回车.
- 去掉特殊含义需要使用\
如果使用脚本,就没有这个问题了
2.2.定时任务关于命令路径的故障
在定时任务运行命令或脚本的时候,只能识别到/bin或/usr/bin目录下面的命令.
只要不在这些目录下面的命令,就要使用绝对路径或者重新定义下PATH环境变量
故障案例:
现象: 命令行执行命令或脚本是成功的,交到了定时任务中执行,提示命令找不到.
原因: 定时任务运行脚本的时候或命令的时候,只能识别/bin和/usr/bin目录下面的命令.其他的命令无法识别
解决方案:
🅰️简单粗暴,遇到这种命令,直接写绝对路径.
🅱️治本,在脚本开头 重新定义下PATH环境变量或重新加载下PATH环境变量.
定时任务识别的命令的路径:
PATH linux环境变量,存放命令的位置
linux会在PATH路径中查找,如果有则执行.如果没有提示command not found/ no such file or directory
- 使用解决方案🅰️
cat /servers/scripts/ip.sh
#!/bin/bashhostname
/sbin/ip a s eth0
- 使用解决方案🅱 重新定义PATH
[root@myvps ~]# cat /servers/scripts/ip.sh
#!/bin/bash
export PATH=/usr/bin:/opt/cmatrix/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/.local/bin:/root/binip a s eth0
ipconfig eth0
- 使用解决方案🅱 重新加载PATH变量
[root@myvps ~]# cat /server/scripts/ip.sh
#!/bin/bash
source /etc/profile #重新加载PATH环境变量
hostname
ip a s eth0
2.3.定时任务没有定向到空或追加到文件故障案例
现象:
邮件服务开启: 不断收到邮箱 You have new mail in /var/spool/mail/root
邮件服务关闭: 一些邮件的临时目录不断堆积小文件. /var/spool/postfix/maildrop
原因:
定时任务运行命令或脚本的时候,命令或脚本有输出,定时任务就会通过邮件形式发送给root.
解决:
定时任务中命令或脚本定向到空或追加到文件
#定向到空
#1. 同步时间 by lidao996 at 20221111
*/2 * * * * /sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1#追加到文件
#4. echo
* * * * * echo oldboy >> /tmp/lidao.txt 2>&1
#2. 定时备份 /etc/ 目录 by lidao996 at xxxx
00 01 * * * /bin/sh -x /server/scripts/backup-etc.sh &>> /tmp/script.log
3.使用案例
3.1定时备份/etc/目录到/backup以ip地址命名的目 录中
-
书写脚本+变量
-
取出ip存放变量 ✅
-
取出时间存放到变量 ✅
-
创建以ip命名目录 ✅
-
打包压缩存放到这个ip地址命名的目录中,压缩包加上时间 ✅
-
-
书写定时任务(每分钟)
-
书写定时任务(改为指定时间)
3.2.定时系统巡检(定时输出系统基本信息)写入 到/tmp/sys.log中.
- 通过手动或自动方式,获取所有主机的基本信息.
- 未来这个操作可以通过监控实现.
主机名信息(主机名)
ip地址
负载信息(0 0 0)
内存信息(内存多大,用了多少,剩余多少)
cpu信息(核心数)
磁盘信息(磁盘使用多少,剩余多少)
进程信息(一共多少进程,几个运行,几个挂起,几个僵尸)
- 写入到/tmp/sys.log文件的格式
#################################
主机名: myvps ip地址: 10.0.0.200
#################################
负载信息
最近1分钟: 0
最近5分钟: 0
最近15分钟: 0
#################################
内存信息(单位kb)
总计内存: 2000000
内存使用了多少: 200000
内存使用率: 10%
#################################
swap信息
swap总大小: 200000
swap使用大小: 0
swap使用率: 0
#################################
磁盘信息
几块硬盘: 1
根分区大小: 20G
根分区使用率: 10%
################################
进程信息
进程总数: 100
运行中进程: 2
挂起进程数量: 0
僵尸进程数量: 0
################################
-
步骤:
-
思路01:
- 定义变量
- 最后统一输出
-
思路02:✅
- 根据模块定义变量
- 每个模块输出
-
-
流程
- 实际结果
3.3.发送邮件
-
邮件
- 最简单一种发送方式
-
配置发件人:163
-
获取:授权码(用户密码)
-
linux配置/etc/mail.rc
-
完成
HRQPVKNACQMQOLYZ 只是一个验证码
-
-
收件人:qq
-
通过命令发送
-
配置发件人
- 获取授权码
- 配置linux mail.rc 配置发件人信息
vim /etc/mail.rc #写到最后
#未加密的发送方式通过25端口,会被公有云封掉.
cat >>/etc/mail.rc <<EOF
set from=lidao996@163.com
set smtp=smtp.163.com
set smtp-auth-user=lidao996@163.com
set smtp-auth-password=BGRCTL CZXIT
set smtp-auth=login
EOF#加密的方式465端口
cat >>/etc/mail.rc <<EOF
set nss-config-dir=/etc/pki/nssdb/
set smtp-user-starttls
set ssl-verify=ignore
set from=lida996@163.com
set smtp=smtps:smtp.163.com:465
set smtp-auth-user=lido996@163.com
set smtp-auth-password=aaaa
set smtp-auth=login
EOF
set from=lidao996@163.com #配置发件人
set smtp=smtp.163.com #配置使用163发送邮件 如果是加
密smtps:smtp.163.com:465
set smtp-auth-user=lidao996@163.com #用户名:邮箱名字
set smtp-auth-password=BGRCTLKQDU IT #授权码
set smtp-auth=login #认证形式login
#下面3行用于配置加密方式进行传输
set nss-config-dir=/etc/pki/nssdb/
set smtp-user-starttls
set ssl-verify=ignore
配置加密方式发送邮件错误: Error in certificate: Peer's certificate issuer is not recognized
解决方法:
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
- 发送邮件
cat /backup/result.log |mail -s "今日巡检的结果" youjiu_linux@qq.com
mail -s '巡检' youjiu_linux@qq.com < backup/result.log
- 发送邮件带上附件
echo "巡检信息在附件" |mail -s "巡检结果" -a /backup/result.log youjiu_linux@qq.com
- 写入定时任务
- 脚本:
- 获取系统各种指标与信息 脚本
- 存放到文件 命令
- 把文件内容通过邮件发送走
- 脚本:
脚本关系
sh /server/scripts/send-mail.sh调用执行sh /server/scripts/sys-info.sh 脚本上面脚本的结果写入到/backup/result.log文件中通mail命令把result.log发送给对应的用户
- 测试定时任务
#6. 系统巡检并发送邮件
* * * * * sh /server/scripts/send-mail.sh &>/dev/null
3.4.表格
- csv表格:通过逗号分割的内容