在Linux系统中,进程是程序执行的基本单位,系统的稳定运行依赖于所有进程的有序管理,随着系统运行时间的增长,进程可能会出现异常占用资源、僵死、意外退出等问题,因此对进程进行有效监控是系统管理员的重要工作之一,通过编写监控脚本,可以自动化地跟踪进程状态、资源使用情况,并在出现异常时及时告警,从而提升系统的可靠性和可维护性。

Linux进程监控的核心要素
在设计进程监控脚本时,首先需要明确监控的核心要素,这些要素直接反映了进程的健康状况和系统负载情况。
进程存在性:最基本的监控目标是确认关键进程是否正常运行,Web服务器的Nginx进程、数据库服务器的MySQL进程等,一旦这些进程不存在,可能导致服务中断。
资源使用率:包括CPU占用率、内存使用量、文件描述符数量等,若某个进程的CPU或内存使用率持续过高,可能意味着进程存在性能问题或陷入死循环,会影响系统整体性能。
进程状态:Linux进程状态包括运行(R)、睡眠(S)、僵尸(Z)等状态,僵尸进程无法自动回收,会占用系统资源;长时间不可中断睡眠的进程可能存在异常,需要重点关注。
子进程数量:某些服务会创建子进程处理请求,如Apache的worker模式,子进程数量异常增多或减少,可能表明服务负载异常或存在配置问题。
常用监控命令与工具
编写监控脚本需要依赖Linux系统自带的命令行工具,这些工具能够提供详细的进程信息。
ps命令:ps命令用于查看当前系统的进程状态,结合-ef或aux参数可以显示所有进程的详细信息。ps -ef | grep nginx可以筛选出Nginx相关进程。
top/htop命令:top命令实时显示进程的资源占用情况,按CPU或内存排序,适合动态监控进程性能,htop是top的增强版,支持鼠标操作和颜色区分,更易于使用。
pgrep/pkill命令:pgrep可以根据进程名、进程ID等属性查找进程,返回进程ID;pkill则可以根据进程名发送信号,用于终止进程,适合在脚本中实现自动化操作。
lsof命令:lsof用于列出进程打开的文件,可以监控进程的文件描述符使用情况,判断是否存在文件句柄泄露问题。
/proc文件系统:/proc目录包含当前系统中所有进程的信息,如/proc/[pid]/stat可获取进程的状态、CPU时间等数据,通过读取这些文件可以实现对进程的底层监控。
基础进程监控脚本实现
以下是一个简单的Bash脚本示例,用于监控指定进程是否存在,若不存在则输出告警信息。
#!/bin/bash
# 定义要监控的进程名
PROCESS_NAME="nginx"
# 使用pgrep检查进程是否存在
if ! pgrep -x "$PROCESS_NAME" > /dev/null; then
# 输出告警信息到终端
echo "告警:进程 $PROCESS_NAME 未运行!"
# 可选:发送邮件或短信告警
# echo "进程 $PROCESS_NAME 未运行" | mail -s "进程告警" admin@example.com
fi
将上述脚本保存为process_monitor.sh,通过chmod +x process_monitor.sh添加执行权限,然后使用crontab -e添加定时任务,例如每分钟执行一次:* * * * * /path/to/process_monitor.sh。

高级监控脚本:资源使用率与告警
在基础监控之上,可以扩展脚本功能,增加对资源使用率的监控,以下脚本监控Nginx进程的CPU和内存使用率,若超过阈值则告警。
#!/bin/bash
PROCESS_NAME="nginx"
CPU_THRESHOLD=80 # CPU使用率阈值(%)
MEM_THRESHOLD=90 # 内存使用率阈值(%)
# 获取进程ID
PID=$(pgrep -x "$PROCESS_NAME")
if [ -z "$PID" ]; then
echo "告警:进程 $PROCESS_NAME 未运行!"
exit 1
fi
# 获取CPU和内存使用率
CPU_USAGE=$(ps -p "$PID" -o %cpu --no-headers | awk '{printf "%.0f", $1}')
MEM_USAGE=$(ps -p "$PID" -o %mem --no-headers | awk '{printf "%.0f", $1}')
# 判断是否超过阈值
if [ "$CPU_USAGE" -gt "$CPU_THRESHOLD" ] || [ "$MEM_USAGE" -gt "$MEM_THRESHOLD" ]; then
echo "告警:进程 $PROCESS_NAME 资源使用率异常!"
echo "CPU使用率:${CPU_USAGE}%,内存使用率:${MEM_USAGE}%"
# 可选:自动重启进程或触发其他操作
# kill -9 "$PID"
# systemctl restart "$PROCESS_NAME"
fi
该脚本通过ps命令获取进程的CPU和内存使用率,并与预设阈值比较,若超过阈值则输出告警信息,可根据实际需求调整阈值或添加自动化处理逻辑。
多进程监控与日志记录
当需要监控多个进程时,可以将进程列表配置在数组或配置文件中,并通过循环遍历实现批量监控,以下示例展示如何监控多个进程并记录日志。
#!/bin/bash
LOG_FILE="/var/log/process_monitor.log"
DATE=$(date +"%Y-%m-%d %H:%M:%S")
# 定义要监控的进程列表
PROCESS_LIST=("nginx" "mysql" "sshd")
for PROCESS in "${PROCESS_LIST[@]}"; do
PID=$(pgrep -x "$PROCESS")
if [ -z "$PID" ]; then
echo "[$DATE] 告警:进程 $PROCESS 未运行" >> "$LOG_FILE"
else
CPU_USAGE=$(ps -p "$PID" -o %cpu --no-headers | awk '{printf "%.0f", $1}')
MEM_USAGE=$(ps -p "$PID" -o %mem --no-headers | awk '{printf "%.0f", $1}')
echo "[$DATE] 进程 $PROCESS 运行正常 - CPU: ${CPU_USAGE}%, 内存: ${MEM_USAGE}%" >> "$LOG_FILE"
fi
done
脚本将监控结果记录到日志文件/var/log/process_monitor.log中,便于后续查看和分析,通过logrotate工具可以管理日志文件大小,避免日志文件无限增长。

监控脚本的优化与扩展
多维度监控:除了CPU和内存,还可以监控磁盘I/O、网络连接数等指标,通过iotop或pidstat命令获取进程的I/O使用情况。
动态阈值调整:根据系统负载动态调整监控阈值,例如在系统繁忙时提高CPU使用率的告警阈值,避免误报。
可视化展示:结合Grafana和Prometheus等工具,将监控脚本采集的数据存储到时序数据库中,并通过图表展示趋势,便于直观分析。
邮件与钉钉告警:通过mail命令或调用企业微信、钉钉API实现告警通知,确保管理员能及时收到异常信息。
Linux进程监控脚本的编写是系统运维的基础技能,通过合理选择监控指标、利用系统命令和工具,可以实现对进程状态的全面把控,从简单的进程存在性检查到复杂的资源使用率分析,监控脚本能够帮助管理员及时发现并解决问题,保障系统的稳定运行,在实际应用中,应根据业务需求灵活调整脚本功能,并结合自动化运维工具构建完善的监控体系,从而提升系统的管理效率和可靠性。




















