省心的邮件提醒监控进程

前言

       在使用服务器运行重要的后台服务的时候,难免因为意外原因造成服务中断宕机。此时一个简单的监控进程就很有必要。监控进程脚本很简单,重点在配置邮件服务。

准备条件

本文中使用的是ubuntu22.04版系统。

正式开始

安装邮件服务

安装前先更新下系统

apt-get update

安装mailutils,出现图形选择界面直接默认下一步就行。

apt-get install -y mailutils

安装s-nail,如果出现图形选择界面也是直接默认下一步就行。

apt-get install -y s-nail

配置外部SMTP

安装好后,将如下几行加入/etc/s-nail.rc这个文件最下面

vim /etc/s-nail.rc

将下面代码粘贴进去。

set from=569157865@163.com              #设置发送邮箱
set smtp=smtps://smtp.163.com:465       #设置smtp服务器和端口
set smtp-auth-user=569157865@163.com    #设置用户名
set smtp-auth-password=IHMRRQHMAXZECVUV #授权码,不是登录密码
set smtp-auth=login                     #认证方式

测试邮件发送

echo "卧槽!牛逼!可以可以!" |s-nail -s "整两句..." 951753852@qq.com

此时打开你的邮箱,查看是否收到邮件。
不出意外主题为”整两句…”,内容为”卧槽!牛逼!可以可以!”的邮件就发过来了。

SMTP配置补充说明

本文配置的发送邮件的邮箱是163平台的。如果是你配置的是同一平台并且使用的是同一端口,smtp服务器和端口就无需修改。另外保持服务465端口开放,用哪个开放哪个就行。下面详细说明。

  • set from=569157865@163.com
    这个为发送邮箱,不需多说

  • set smtp=smtps://smtp.163.com:465

    1. 163.com
      接收邮件服务器:pop.163.com,端口:110或995(使用SSL时)
      接收邮件服务器:imap.163.com,端口:143或993(使用SSL时)
      发送邮件服务器:smtp.163.com,端口:25或465/994(使用SSL时)
    2. 126邮箱
      接收邮件服务器:pop.126.com,端口:110
      发送邮件服务器:smtp.126.com,端口:25
    3. 139邮箱
      POP3服务器地址:POP.139.com,端口:110
      SMTP服务器地址:SMTP.139.com,端口:25
    4. QQ邮箱
      接收邮件服务器:pop.qq.com,端口:110或995(使用SSL时)
      接收邮件服务器:imap.qq.com,端口:143或993(使用SSL时)
      发送邮件服务器:smtp.qq.com,端口:25或465/587(使用SSL时)
    5. Gmail (google.com)
      POP3服务器地址:pop.gmail.com,端口:995(使用SSL)
      SMTP服务器地址:smtp.gmail.com,端口:587(使用SSL)
    6. 雅虎邮箱
      接收邮件服务器:pop.mail.yahoo.cn,端口:110或995(使用SSL时)
      接收邮件服务器:imap.mail.yahoo.cn,端口:143或993(使用SSL时)
      发送邮件服务器:smtp.mail.yahoo.cn,端口:25或465(使用SSL时)
    7. HotMail
      接收邮件服务器:pop3.live.com,端口:995
      发送邮件服务器:smtp.live.com,端口:25
  • set smtp-auth-user=569157865@163.com
    跟发送邮箱保持一致就行

  • set smtp-auth-password=IHMRRQHMAXZECVUV
    授权码,需要去到平台,如图:

  • set smtp-auth=login
    此项为固定模式

发送邮件没问题的话,至此配置SMTP服务完成。可以进行下一步了。

监控脚本

在后台运行服务的同级目录新建一个MonitoringProcess.sh文件,名称随意。

touch MonitoringProcess.sh

然后将下面这段代码粘贴进去,保存退出。两种方式监测进程:(二选一)

  • 进程的完整名称
  • 进程ID

可根据自己的需要改良代码。比如监测多个进程等。

方式:1

ps -ef | grep 名称          #获取进程PID
ps -p 进程PID -o comm=      #返回完整进程名称

以上两个指令可获取需要的参数。

#!/bin/bash

while true; do
    #if pgrep 进程的完整名称 > /dev/null; then   #进程完整名称
    if ps -p 进程PID > /dev/null; then       #进程PID
    sleep 10   #每10秒查询一次。
else
    current_time=$(TZ='Asia/Shanghai' date +"%Y-%m-%d %H:%M:%S")
    echo "宕机时间:$current_time"|s-nail -s "微信的进程服务已宕机" 12345678@qq.com
    # 一旦邮件发送,终止循环以防止不断发送邮件
    break
  fi
done

方式2

#!/bin/bash

# 进程的PID列表,可以根据需要添加多个进程的PID或进程名称
processes=("进程PID1" "进程PID2" "进程PID3")  # 用进程名称替代PID时可以改成名称

# 循环监控
while true; do
  all_running=true   # 假设所有进程都在运行
  for pid in "${processes[@]}"; do
    if ! ps -p "$pid" > /dev/null 2>&1; then   # 检查进程是否运行
      all_running=false   # 如果有进程宕机,标记为 false
      current_time=$(TZ='Asia/Shanghai' date +"%Y-%m-%d %H:%M:%S")
      echo "宕机时间:$current_time, 进程PID: $pid 已宕机" | s-nail -s "微信的进程服务已宕机" 12345678@qq.com
    fi
  done

  if ! $all_running; then
    # 如果有进程宕机,退出循环以防止不断发送邮件
    break
  fi

  sleep 10   # 每10秒检查一次
done

方式3

processes=("进程名称1" "进程名称2" "进程名称3")

while true; do
  all_running=true
  for proc in "${processes[@]}"; do
    if ! pgrep -f "$proc" > /dev/null 2>&1; then   # 使用 pgrep 检查进程名称
      all_running=false
      current_time=$(TZ='Asia/Shanghai' date +"%Y-%m-%d %H:%M:%S")
      echo "宕机时间:$current_time, 进程名称: $proc 已宕机" | s-nail -s "微信的进程服务已宕机" 12345678@qq.com
    fi
  done

  if ! $all_running; then
    break
  fi

  sleep 10
done

运行监测脚本指令,返回的信息大于0说明运行成功了。注意:先开启服务,再开启监测脚本。

nohup bash MonitoringScripts.sh &       #运行

至此整个监测进程就搭建完成了。

补充:本文可以搭配这个场景使用。https://blog.hbb.cloudns.org/article/000011/.html