我正在编写一个unix shell脚本,需要检查目录中是否有正在运行的进程“xyz”。如果是,则继续执行下一个命令,并显示“找到它”之类的文本。
如果不是不继续并显示“未找到过程”这样的文本。
我试过这样的事情:
if ps -ef | grep xyz
then
echo "XYZ Process Found!"
else
echo "XYZ Process Not Found!"
fi
但即使没有xyz进程,它只是向我显示进程并显示“已找到进程”。
答案 0 :(得分:3)
当您运行grep xyz
时,该流程 - grep xyz
- 也正在运行&因此显示在ps -ef
的输出中
此运行的进程命令行包含xyz
。因此grep将该行传递给输出
因此,您总是获得零退出状态 - 即成功。
2解决方案:
使用if ps -ef | grep '[x]yz'; then
。 (您可能希望使用grep
)来禁止-q
输出
正在运行的grep命令是grep [x]yz
。这将打印在ps -ef
输出中
显然,grep会过滤掉这一行。 [x]yz
可以与\[x\]yz
匹配,而不是[x]yz
。
使用if pgrep -f xyz >/dev/null; then
查看man pgrep
了解详情..
答案 1 :(得分:2)
我相信您希望使用Command substition来检查命令的输出,来自链接的bash-hackers wiki 命令替换扩展为命令的输出。这些命令在子shell中执行,其stdout数据是替换语法扩展的内容。此外,计算行并删除grep。像,
if [[ $(ps -ef | grep xyz | grep -v grep | wc -l) != 0 ]]; then
echo "XYZ Process Found!"
else
echo "XYZ Process Not Found!"
fi
修改强>
根据以下评论,您应该使用
if [[ $(ps -ef | grep -c xyz) -ne 1 ]]; then
这更容易阅读。
答案 2 :(得分:2)
您也可以使用pgrep
。来自pgrep(1)
:
pgrep查看当前正在运行的进程并列出 将选择条件与stdout匹配的进程ID。
[...]
退出状态
0一个或多个流程符合标准 1没有匹配的流程。
2命令行中的语法错误。
3致命错误:内存不足等。
示例输出:
[~]% pgrep xterm
18231
19070
31727
您可以在if
语句中使用它,如下所示:
if pgrep xterm > /dev/null; then
echo Found xterm
else
echo xterm not found
fi
注意:pgrep
不是标准实用程序(即它不在POSIX中),但至少可以在Linux上广泛使用,我相信大多数BSD系统。