在Linux系统中,进程是程序执行的基本单元,监控进程的运行状态对于系统稳定性、性能优化和故障排查至关重要,通过编写进程监控脚本,管理员可以实时掌握进程的存活情况、资源占用、异常行为等,及时采取应对措施,本文将详细介绍Linux进程监控脚本的编写方法、常用技术及实用案例。

进程监控的核心目标
进程监控的核心目标包括:确保关键进程持续运行(如Web服务、数据库服务)、检测进程资源占用(CPU、内存)是否异常、识别僵尸进程或僵死线程,以及记录进程的启停时间与错误日志,这些目标能帮助管理员主动发现系统问题,避免服务中断或性能瓶颈。
监控脚本的实现基础
进程状态查询命令
Linux提供了多种命令查询进程信息,ps命令是最常用的工具之一。ps -ef显示所有进程的详细信息,ps -aux按用户 CPU 占比排序;pgrep命令可根据进程名或PID筛选进程,如pgrep -f nginx返回所有nginx进程的PID。top和htop可实时动态展示进程资源占用,适合交互式监控。
进程状态标识
进程状态(STAT)是监控的关键指标,常见状态包括:
- R(运行):进程正在运行或就绪;
- S(睡眠):进程等待事件完成;
- D(不可中断睡眠):通常等待I/O操作,需手动干预;
- Z(僵尸):进程已终止但父进程未回收,需重点关注;
- T(停止):进程被暂停或 traced。
脚本中可通过ps -p <PID> -o stat=获取进程状态,判断是否异常。

基础进程监控脚本示例
以下是一个简单但实用的进程监控脚本,核心功能是检测关键进程是否存在,若不存在则自动重启并记录日志。
#!/bin/bash
# 定义需要监控的进程名
PROCESS_NAME="nginx"
LOG_FILE="/var/log/process_monitor.log"
RESTART_CMD="systemctl restart nginx"
# 检查进程是否存在
check_process() {
if pgrep -f "$PROCESS_NAME" > /dev/null; then
return 0 # 进程存在
else
return 1 # 进程不存在
fi
}
# 记录日志
log_message() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
}
# 主监控逻辑
main() {
if check_process; then
log_message "$PROCESS_NAME is running."
else
log_message "Error: $PROCESS_NAME is not running. Attempting to restart..."
$RESTART_CMD
if check_process; then
log_message "$PROCESS_NAME restarted successfully."
else
log_message "Failed to restart $PROCESS_NAME. Manual intervention required."
fi
fi
}
# 执行监控
main
脚本说明:
- 进程检测:使用
pgrep -f匹配进程名,避免误判(如进程名包含子字符串)。 - 日志记录:将监控结果写入日志文件,便于后续审计。
- 自动重启:通过
systemctl或service命令重启服务,适用于systemd管理的服务。
可将脚本加入crontab,每5分钟执行一次:*/5 * * * * /path/to/process_monitor.sh。
高级监控:资源占用与异常检测
基础监控仅关注进程存活,实际场景中还需监控资源占用和异常行为,以下脚本扩展了CPU、内存占用检测,并支持阈值告警。
#!/bin/bash
PROCESS_NAME="mysql"
CPU_THRESHOLD=80 # CPU使用率阈值(%)
MEM_THRESHOLD=90 # 内存使用率阈值(%)
LOG_FILE="/var/log/process_monitor_resource.log"
# 获取进程PID
PID=$(pgrep -f "$PROCESS_NAME")
if [ -z "$PID" ]; then
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Error: $PROCESS_NAME not running." >> "$LOG_FILE"
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" ]; then
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Warning: $PROCESS_NAME CPU usage is ${CPU_USAGE}% (threshold: ${CPU_THRESHOLD}%)." >> "$LOG_FILE"
fi
if [ "$MEM_USAGE" -gt "$MEM_THRESHOLD" ]; then
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Warning: $PROCESS_NAME memory usage is ${MEM_USAGE}% (threshold: ${MEM_THRESHOLD}%)." >> "$LOG_FILE"
fi
# 检查僵尸进程
if ps -p "$PID" -o stat= | grep -q "Z"; then
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Critical: $PROCESS_NAME is in zombie state." >> "$LOG_FILE"
kill -9 "$PID" # 强制终止僵尸进程
fi
功能扩展:
- 资源阈值告警:当CPU或内存占用超过阈值时,记录警告日志。
- 僵尸进程处理:通过
stat字段检测僵尸进程并强制终止,避免资源泄漏。 - 动态阈值:可根据服务器配置调整阈值,例如高内存服务器可适当放宽内存限制。
多进程监控与集群管理
在生产环境中,需同时监控多个进程(如Nginx、MySQL、Redis),可通过数组或配置文件管理进程列表,实现批量监控。

#!/bin/bash
# 进程列表配置(格式:进程名|重启命令|CPU阈值|内存阈值)
PROCESSES=(
"nginx|systemctl restart nginx|80|90"
"mysql|systemctl restart mysql|85|95"
"redis|systemctl restart redis|70|85"
)
LOG_FILE="/var/log/multi_process_monitor.log"
monitor_process() {
local process_info=($1)
PROCESS_NAME="${process_info[0]}"
RESTART_CMD="${process_info[1]}"
CPU_THRESHOLD="${process_info[2]}"
MEM_THRESHOLD="${process_info[3]}"
PID=$(pgrep -f "$PROCESS_NAME")
if [ -z "$PID" ]; then
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Error: $PROCESS_NAME not running. Restarting..." >> "$LOG_FILE"
$RESTART_CMD
return
fi
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 "[$(date '+%Y-%m-%d %H:%M:%S')] Warning: $PROCESS_NAME resources exceeded (CPU: ${CPU_USAGE}%, MEM: ${MEM_USAGE}%)." >> "$LOG_FILE"
fi
}
# 遍历监控所有进程
for process in "${PROCESSES[@]}"; do
monitor_process "$process"
done
优势:
- 配置灵活:通过修改
PROCESSES数组即可增减监控进程,无需修改脚本逻辑。 - 批量管理:适合中小型集群,统一管理多个关键服务。
监控脚本的优化与最佳实践
- 日志管理:使用
logrotate工具轮转日志文件,避免单个日志文件过大。 - 告警集成:结合邮件(
mail命令)、企业微信或钉钉机器人,实现实时告警通知。 - 性能优化:避免频繁调用
ps命令,可结合/proc文件系统直接读取进程信息(如/proc/$PID/stat),减少资源消耗。 - 权限控制:脚本使用普通用户执行时,需确保对
/var/log目录有写权限,或使用sudo提升权限。
Linux进程监控脚本是实现自动化运维的重要工具,从基础的存活检测到高级的资源分析与集群管理,可根据实际需求灵活扩展,通过合理设计脚本结构、优化性能和集成告警机制,管理员可以高效保障系统稳定运行,减少人工干预成本,无论是单机服务器还是小型集群,定制化的监控脚本都能成为提升运维效率的利器。



















