shell脚本(五):根据进程id判断是否执行并定时发送到企业微信里

一 脚本

#!/bin/bash

# 定义要监控的进程关键字数组
process_keywords=("nginx" "tomcat" "redis" "hadoop" "mysql" "docker")

webhook_url="https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx" # 替换为你的企业微信 webhook 地址
log_file="/var/log/process_monitor.log" # 定义日志文件路径

# 遍历进程关键字数组
for keyword in "${process_keywords[@]}"; do
    pid=$(ps -ef | grep "$keyword" | grep -v grep | awk '{print $2}')
    timestamp=$(date +"%Y-%m-%d %H:%M:%S") # 获取当前时间戳

    echo "$timestamp - PID for $keyword is: $pid" >> "$log_file"

    if [ -z "$pid" ]; then
        message_content="$keyword 进程已停止!" # 为每个进程生成不同的消息内容
        echo "$timestamp - Process '$keyword' not found." >> "$log_file"
        curl -s "$webhook_url" \
            -H 'Content-Type: application/json' \
            -d "{
                \"msgtype\": \"text\",
                \"text\": {
                    \"content\": \"$message_content\",
                    \"mentioned_list\": [\"@all\"]
                }
            }"
    else
        echo "$timestamp - Process '$keyword' is running (PID: $pid)." >> "$log_file"
        # 获取进程的详细信息
        process_info=$(ps -ef | grep "$keyword" | grep -v grep)
        # 构造要发送到微信的消息
        message_content="$keyword 进程正在运行,详细信息:\n\`\`\`\n$process_info\n\`\`\`"
        # 发送微信通知
        curl -s "$webhook_url" \
            -H 'Content-Type: application/json' \
            -d "{
                \"msgtype\": \"text\",
                \"text\": {
                    \"content\": \"$message_content\",
                    \"mentioned_list\": [\"@all\"]
                }
            }"
        echo "$timestamp - Process '$keyword' details:\n$process_info" >> "$log_file"
    fi
done

修改说明:

  1. 定义日志文件路径:
    • 使用 log_file="/var/log/process_monitor.log" 定义日志文件路径。你可以根据需要修改路径。
  2. 获取时间戳:
    • 使用 timestamp=$(date +"%Y-%m-%d %H:%M:%S") 获取当前时间戳,以便在日志中记录时间。
  3. 写入日志文件:
    • echo 命令中使用 >> "$log_file" 将输出追加到日志文件中。
    • 在进程正常运行和停止时,都将相关信息写入日志文件。
    • 在进程正常运行时,将进程的详细信息也写入日志文件。

如何使用:

  1. 替换 webhook 地址:
    • webhook_url 变量替换为你的企业微信机器人的实际 webhook 地址。
  2. 修改进程关键字数组:
    • 根据需要修改 process_keywords 数组,添加或删除要监控的进程关键字。
  3. 修改日志文件路径(可选):
    • 根据需要修改 log_file 变量,更改日志文件路径。
  4. 运行脚本:
    • 保存脚本并运行,它将依次监控数组中的每个进程,并将运行状态和详细信息写入日志文件。

日志文件示例:

2023-10-27 10:00:00 - PID for nginx is: 1234
2023-10-27 10:00:00 - Process 'nginx' is running (PID: 1234).
2023-10-27 10:00:00 - Process 'nginx' details:
root      1234     1  0 10:00 ?        00:00:00 nginx: master process /usr/sbin/nginx -g daemon off;
nobody    1235  1234  0 10:00 ?        00:00:00 nginx: worker process
...
2023-10-27 10:01:00 - PID for tomcat is:
2023-10-27 10:01:00 - Process 'tomcat' not found.
...

通过这个修改,你可以将所有进程的运行状态和详细信息都记录到日志文件中,方便你进行查看和分析。

二 脚本运行前准备

转换格式

dos2unix ps1.sh

赋予权限

chmod +x ps1.sh

三 修改为定时任务

好为了将你的进程监控脚本设置为定时任务,你需要使用 cron 工具。cron 是 Linux/Unix 系统中用于定时执行任务的工具。

[root@mysql-master opt]# crontab -u root -e
no crontab for root - using an empty one
crontab: installing new crontab
[root@mysql-master opt]# crontab -u root -l 
*/5 * * * * /opt/ps1.sh

在里面添加这个消息发送时间

*/5 * * * * /opt/ps1.sh