当前位置: 首页 > news >正文

day022-定时任务-故障案例与发送邮件

文章目录

  • 1. cron定时任务无法识别命令
    • 1.1 故障原因
    • 1.2 解决方法
      • 1.2.1 对命令使用绝对路径
      • 1.2.2 在脚本开头定义PATH
  • 2. 发送邮件
    • 2.1 安装软件
    • 2.2 配置邮件信息
    • 2.3 巡检脚本与邮件发送
      • 2.3.1 巡检脚本内容
      • 2.3.2 制作时任务发送邮件
  • 3. 调取API发送邮件
    • 3.1 编写文案脚本
    • 3.2 制作定时任务
  • 4. ubuntu使用mail
  • 5. 踩坑记录
    • 1. /bin和/usr/bin的关系?
    • 2. 去除前面空格
    • 3. 为什么 `crontab -e` 不继承用户 Shell 的 `PATH`?
    • 4. 虚拟机经常进入紧急模式
    • 5. 脚本中awk的参数被识别为变量
  • 6. 思维导图

1. cron定时任务无法识别命令

1.1 故障原因

  • PATH变量定义的位置(全局配置文件):/etc/environment
[root@oldboy99-Kylin ~]# cat /etc/environment
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin"
  • cron的PATH变量不继承用户的PATH
  • cron的PATH变量,可以通过定时任务查看:
# 查看cron的PATH
* * * * * echo PATH:$PATH >>/var/log/path.log 2>&1
#################################################
cron的PATH变量:/usr/bin:/bin

  • 可以看到cron的PATH缺少/sbin,因此有些命令运行不了

1.2 解决方法

1.2.1 对命令使用绝对路径

  • 不推荐,命令较少时可以这样做

1.2.2 在脚本开头定义PATH

  • export PATH=/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
  • source /etc/profile,推荐使用

2. 发送邮件

  • 系统:麒麟/红帽

2.1 安装软件

  • yum install -y mailx sendmail

2.2 配置邮件信息

  • mail命令的配置文件:/etc/mail.rc

发件人信息:

  • 使用163邮箱
  • 邮箱:skx2554798585@163.com
  • 授权码:CPVZ6355KsCtEUik
  • 邮件服务端地址:smtp.163.com

将发件人信息写入mail配置文件中:

vim /etc/mail.rc #写到最后cat >>/etc/mail.rc <<EOFset from=skx2554798585@163.comset smtp=smtp.163.comset smtp-auth-user=skx2554798585@163.comset smtp-auth-password=CPVZ6355KsCtEUikset smtp-auth=loginEOF

2.3 巡检脚本与邮件发送

2.3.1 巡检脚本内容

[root@oldboy99-Kylin /server/scripts]# cat check_system_mail.sh
#!/bin/bash
#desc:系统巡检脚本
source /etc/profile#基本信息
#1.vars 变量部分
hostname=`hostname`
ip=`hostname -I`
os=`hostnamectl |grep 'Operating System'|awk -F ': +' '{print $2}'`
kernel=`hostnamectl |grep 'Kernel' |awk -F ': +' '{print $2}'`
total=`top -bn1 |awk -F ': +| ' 'NR==2{print $2}'`
zom=`top -bn1 |awk 'NR==2{print $(NF-1)}'`
cpu=`uname -m`
result_dir="/tmp/result.txt"
title="`date +%F`-系统巡检结果"
mail="skx2554798585@qq.com"#2.使用
cat >${result_dir}<< EOF
====主机基本信息====
主机名:$hostname
ip:$ip
系统版本:$os
内核版本:$kernel
CPU架构:$cpu
====主机进程信息====
进程总数:$total
僵尸进程数量:$zom
EOF#3.发送邮件
cat $result_dir |mail -s $title $mail

2.3.2 制作时任务发送邮件

# 巡检结果,发送邮件
0 8 * * * /bin/bash /server/scripts/check_system_mail.sh >/dev/null 2>&1

3. 调取API发送邮件

  • API网址:[天聚数行TianAPI - 应用开发者API数据调用平台](https://www.tianapi.com/)
[root@oldboy99-Kylin /server/scripts]#  curl -X POST \
>  -H "Content-Type:application/x-www-form-urlencoded" \
>  -d "key=045a8a29190663ed52c2ee82f22d739d" \
>  "https://apis.tianapi.com/pyqwenan/index"
{"code":200,"msg":"success","result":{"content":"在所有的道别里,我最喜欢明天见。","source":"佚名"}}

3.1 编写文案脚本

#!/bin/bash
#desc:朋友圈文案
#author:孙克旭source /etc/profile# vars
url='curl -s -X POST  -H "Content-Type:application/x-www-form-urlencoded"  -d "key=045a8a29190663ed52c2ee82f22d739d"  "https://apis.tianapi.com/pyqwenan/index"'
title="`date +%F`-pyq"
mail="skx2554798585@qq.com"# 发送邮件
$url |awk -F '"' '{print $(NF-5)}' |mail -s $title $mail

3.2 制作定时任务

# 发送朋友圈文案
0 8 * * * /bin/bash /server/scripts/copywriting.sh >/dev/null 2>&1

4. ubuntu使用mail

  • 下载的软件包是:s-nail,其他与kylin相同
apt update 
apt install -y s-nail
vim /etc/s-nail.rc 
# 编写的发件人信息与kylin相同
s-nail -s "系统信息" skx2554798585@qq.com </etc/hostname

5. 踩坑记录

1. /bin和/usr/bin的关系?

在这里插入图片描述

  • 简直是怪事

  • 其实/bin和/bin/是不一样的

  • 这是因为加了斜杠 /bin/ls 会自动解析符号链接并显示目标(即 /usr/bin)的属性。

  • 关键区别

    • ls -ld /bin → 显示链接本身属性(lrwxrwxrwx)。
    • ls -ld /bin/ → 显示链接指向的目标属性(dr-xr-xr-x)。

2. 去除前面空格

[root@oldboy99-Kylin ~]# lscpu |grep '型号名称' |awk -F ':' '{print $2}'Intel(R) Core(TM) i5-9300H CPU @ 2.40GHz
[root@oldboy99-Kylin ~]# lscpu |grep '型号名称' |awk -F ':' '{print $2}' |xargs 
Intel(R) Core(TM) i5-9300H CPU @ 2.40GHz
  • xargs 不接任何命令时,它仅做空白清理和行合并,不会尝试将输入传递给其他命令。

3. 为什么 crontab -e 不继承用户 Shell 的 PATH

安全性与隔离性:cron 任务在非交互式、非登录 Shell 中运行,不会加载 ~/.bashrc~/.profile 等配置文件。

最小化原则:避免因用户环境变量差异导致任务执行异常。

4. 虚拟机经常进入紧急模式

在这里插入图片描述

在这里插入图片描述

  • 这两个硬盘名称一直更换

  • 解决方法:在/etc/fstab文件中用UUID定义分区
  • 难点在于在紧急模式中复制UUID
[root@oldboy99-Ubuntu ~]# blkid |grep sda1 |awk -F '"' '{print $2}' 
d32fb407-77bf-434c-aa7c-c794a581e08e
# 可以直接追加到文件中
blkid |grep sda1 |awk -F '"' '{print $2}' >> /etc/fstab
  • 编辑磁盘管理文件时,用v选择区域,d剪切,p粘贴

在这里插入图片描述

5. 脚本中awk的参数被识别为变量

[root@oldboy99-Kylin /server/scripts]# bash copywriting.sh
copywriting.sh:行13: NF-5:未找到命令

脚本中命令为:$url |awk -F '"' "{print $(NF-5)}" |mail -s $title $mail

  • $(NF-5)被双引号包裹,因此$(NF-5)被认为是变量
  • 将双引号改为单引号(直接被识别为字符串)即可:$url |awk -F '"' '{print $(NF-5)}' |mail -s $title $mail

6. 思维导图

【金山文档 | WPS云文档】 思维导图 https://kdocs.cn/l/co3I7PtpTYQX

http://www.xdnf.cn/news/676189.html

相关文章:

  • 字节跳动推出开源多模态模型 BAGEL 从图像生成到世界建模
  • java上机测试错题回顾(2)
  • 万象生鲜配送系统 2025-05-23 更新日志
  • 使用新一代达梦管理工具SQLark,高效处理 JSON/XML 数据!
  • 多元一次不定方程
  • NGINX HTTP/2 全面指南开启、调优与实战
  • HTML常见事件详解:从入门到实战应用
  • OpenHarmony定制系统组合按键(一)
  • springBoot项目测试时浏览器返回406问题解决方案
  • iOS QQ抽屉式导航的实现
  • NIFI的性能调优
  • FilterAnalysis -滤波器分析
  • 用nz-tabel写一个合并表格
  • 利用机器学习优化数据中心能效
  • 深度学习实战109-智能医疗随访与健康管理系统:基于Qwen3(32B)、LangChain框架、MCP协议和RAG技术研发
  • 复杂度拆解
  • 程序环境与预处理
  • Cesium添加点、线、面
  • TF 卡 U1 和 U3 有什么区别?一文解析关键差异
  • SQL语句内容处理——给每行内容都添加单引号和逗号
  • 理解vue-cli 中进行构建优化
  • 【Elasticsearch】`_refresh`和`_flush`的区别
  • vue3+vite+amfe-flexible+postcss-pxtorem 实现全分辨率自适应
  • AI工具的选择:Dify还是传统工具?
  • 【C++】封装哈希表实现 unordered_map、unordered_set
  • 【Harmony OS】组件自定义属性、事件和状态管理
  • 【Webtrees 手册】第 9 章 - 开发指南
  • Mobaxterm 连接到 Docker 容器
  • 查询端口占用情况的命令(windows、linux)
  • Flink Table API 编程实战详解