判断进程是否存在应依赖命令退出状态而非输出内容,推荐用pgrep -x精确匹配,或用ps aux | grep "[p]attern"规避grep自身匹配,systemctl is-active更适用于systemd服务管理。

直接用 grep 判断进程是否存在,关键不是看它输出什么,而是看它的退出状态($?)。grep 找到匹配行时返回 0,没找到返回 1,出错才返回 2。所以判断服务是否存活,本质是检查 grep 是否成功匹配到了对应进程名。
用 pgrep 更可靠(推荐)
pgrep 是专为查进程设计的工具,比 ps | grep 更干净、不易误判(比如避免匹配到 grep 自身或无关进程)。
pgrep nginx && echo "nginx 正在运行"if pgrep -x "redis-server" > /dev/null; then echo "Redis 活着"; else echo "Redis 没启动"; fi-
-x表示精确匹配整个进程名,防止匹配到redis-cli等子进程
如果坚持用 ps + grep,要过滤掉 grep 进程本身
直接 ps aux | grep nginx 常常会匹配到自己这条命令,导致总返回 0,造成误判。
- 技巧:用方括号“绕过”自身匹配:
ps aux | grep "[n]ginx"—— 这样grep进程显示的是grep [n]ginx,不匹配[n]ginx字面量 - 更稳妥写法:
ps aux | grep nginx | grep -v grep,再结合退出码判断 - 实际脚本中建议:
if ps aux | grep "[n]ginx" > /dev/null; then echo "OK"; else echo "DOWN"; fi
检查退出状态的常见写法
不要依赖输出内容,只看 $? 或用 if 直接判断命令成功与否。
ps aux | grep "[s]shd" > /dev/null; echo $? # 输出 0 表示找到,1 表示没找到if ps aux | grep "[m]yapp" > /dev/null; then :; else echo "服务未运行"; fi- 注意:重定向
> /dev/null是为了屏蔽输出,只关心退出码
补充:systemctl 更适合现代 Linux 服务管理
如果服务是 systemd 管理的(绝大多数新系统),优先用 systemctl is-active:
systemctl is-active --quiet nginx && echo "running"-
--quiet抑制输出,靠退出码判断;is-active返回active或inactive,比解析ps更准确可靠 - 它还能区分 “loaded but not running” 和 “not found”,语义更清晰











