第三周作业一:编写一个Bash脚本,能够监控指定名称的进程(例如 nginx 或 sshd)。 如果进程存在,则输出其PID和状态信息 如果进程不存在,则自动尝试重启该进程(可假设进程
#!/bin/bash
# ==================== 配置项(可修改)====================
PROCESS_NAME="sshd" # 要监控的进程名
START_CMD="/usr/sbin/sshd" # 进程启动命令
CHECK_INTERVAL=5 # 检查间隔(秒)
LOG_FILE="/var/log/process_monitor.log" # 日志路径
# ========================================================
# 函数:输出带时间戳的日志
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
}
# 函数:检查进程是否存在
check_process() {
# 使用 pgrep 查找进程,-x 精确匹配名称
PID=$(pgrep -x "$PROCESS_NAME")
if [ -n "$PID" ]; then
# 进程存在
echo "✅ 进程 $PROCESS_NAME 正在运行,PID: $PID"
# 输出详细状态
ps aux | grep -v grep | grep "$PROCESS_NAME"
return 0
else
# 进程不存在
echo "❌ 进程 $PROCESS_NAME 未运行"
return 1
fi
}
# 主循环:每隔5秒检查一次
echo "==================== 启动进程监控 $PROCESS_NAME ===================="
log "监控服务已启动,检查间隔:${CHECK_INTERVAL}秒"
while true; do
# 条件判断:调用函数检查进程
if check_process; then
: # 空命令,进程正常不做操作
else
echo "🔧 尝试自动重启 $PROCESS_NAME..."
log "进程异常,执行重启命令:$START_CMD"
# 后台启动进程
$START_CMD &
# 等待1秒再次检查
sleep 1
if pgrep -x "$PROCESS_NAME" > /dev/null; then
echo "✅ 重启成功!"
log "进程重启成功"
else
echo "❌ 重启失败!"
log "进程重启失败"
fi
fi
echo "------------------------------------------------"
# 循环间隔
sleep $CHECK_INTERVAL
done
chmod +x process_monitor.sh
vim /etc/systemd/system/process-monitor.service
[Unit]
Description=Process Monitor Service
After=network.target
[Service]
ExecStart=/root/process_monitor.sh
Restart=always
User=root
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable process-monitor
systemctl start process-monitor
systemctl status process-monitor
