linux中用while循环监控进程需结合定期检查、健康判断与自动拉起:用pgrep精准匹配pid,叠加nc/curl/ps检查服务可用性,失败时eval重启并sleep防过载,注意nohup/setsid避免sighup及日志记录。

在 Linux 中用 while 循环监控进程存活状态,核心是“定期检查 + 条件判断 + 自动响应”,不是单纯看进程在不在,而是结合实际业务需求做闭环处理。
基础检测:用 ps 或 pgrep 判断进程是否存在
最常用方式是靠 pgrep 或 ps aux | grep 提取 PID。推荐 pgrep,更简洁、不易误匹配:
-
pgrep -x "nginx":精确匹配进程名(排除带 nginx 字符的其他命令) -
pgrep -f "python.*myserver.py":按完整命令行匹配(适合带参数的启动方式) - 检查返回值即可用于 while 条件:
if pgrep -x "redis-server" > /dev/null; then echo "running"; fi
增强判断:不只是“有无”,还要看是否真正可用
仅存在 PID 不代表服务健康。可叠加轻量级探活逻辑:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 对网络服务,加
nc -z localhost 6379检查端口连通性 - 对 Web 服务,用
curl -sf http://localhost:8080/health | grep ok - 对本地进程,检查其主进程状态是否为
R(运行中)或S(睡眠但可唤醒),避免僵尸或僵死:ps -o stat= -p $(pgrep -x myapp) 2>/dev/null | grep -q "[RS]"
自动拉起:进程消失时立即重启
把检测和恢复写进循环体,形成守护逻辑:
- 定义目标命令,如
APP_CMD="nohup /opt/app/server --conf /etc/app.conf > /var/log/app.log 2>&1 &" - 循环内先检测,失败则启动:
if ! pgrep -x "server" > /dev/null; then eval "$APP_CMD"; fi - 每次循环末尾加
sleep 5,避免高频扫描;太短易占 CPU,太长恢复延迟高
安全与健壮:避免常见陷阱
真实环境中要注意作用域、权限和资源回收:
- 用
nohup或setsid启动子进程,防止父 shell 退出导致子进程被 SIGHUP 终止 - 避免在管道中用
while read启动后台任务(子 shell 里启动的进程无法在父 shell 中被 pgrep 到) - 记录日志便于排查:
echo "$(date): restart server" >> /var/log/monitor.log - 若需长期运行,建议配合
nohup ./monitor.sh &或交给 systemd 管理,而非仅依赖前台 while










