为何含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
相关产品推荐
相关产品推荐

