You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何含OR运算符的Bash进程检测脚本出现报错?

解决多进程检测脚本的报错问题

你遇到的-bash: [: -f: binary operator expected错误,核心问题是错误地把命令放进了[ ... ](test命令)里,而且重定向的位置也不对。[ ... ]是用来做字符串、数值这类条件比较的工具,不能直接在里面执行pgrep这类外部命令。

正确的写法思路

pgrep本身会返回退出状态码:找到目标进程时返回0(表示成功),没找到则返回非0(表示失败)。bash的if语句可以直接判断命令的退出状态,完全不需要借助[ ... ]。

方案1:用||连接两个pgrep命令

要实现“只要ghost.py或ghost2.py有一个在运行就判定正常”的逻辑,直接把两个pgrep用||连接即可:

#!/bin/bash
if pgrep -f "ghost.py" > /dev/null || pgrep -f "ghost2.py" > /dev/null
then
    echo "Running" > /dev/null
else
    echo "Looks like a script stopped" | mail -s "Script down" shaney.jones@gmail.com
fi

每个pgrep后面都加上> /dev/null,是为了屏蔽进程ID的输出,避免多余信息干扰脚本执行。

方案2:用pgrep正则匹配一次性检测

其实pgrep支持用正则表达式同时匹配多个进程名,这样写更简洁:

#!/bin/bash
if pgrep -f "ghost(2)?\.py" > /dev/null
then
    echo "Running" > /dev/null
else
    echo "Looks like a script stopped" | mail -s "Script down" shaney.jones@gmail.com
fi

这里的正则ghost(2)?\.py会同时匹配ghost.py和ghost2.py,一条命令就能完成检测,代码更紧凑。

原脚本报错的具体原因

你原来的写法[ pgrep -f "ghost.py" ]是完全错误的:[(也就是test命令)会把pgrep当成一个字符串,把-f当成需要操作数的二元运算符,但找不到对应的操作数,所以bash会抛出“需要二元运算符”的报错。另外,你把> /dev/null放在]后面,只会重定向第二个[ ... ]的输出,第一个pgrep的进程ID还是会打印出来,这也不符合你的需求。

内容的提问来源于stack exchange,提问作者jsstuball

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:28:11