Bash 在unix中,如何确定进程是否正在运行并返回true/false?
我正在编写一个unixshell脚本,需要检查当前是否有正在运行的进程的目录中有“xyz”。如果是,则继续执行下一个命令并显示文本,如“找到它” 如果不是,则不要继续,并显示类似“未找到进程”的文本 我试过这样的方法:Bash 在unix中,如何确定进程是否正在运行并返回true/false?,bash,shell,unix,Bash,Shell,Unix,我正在编写一个unixshell脚本,需要检查当前是否有正在运行的进程的目录中有“xyz”。如果是,则继续执行下一个命令并显示文本,如“找到它” 如果不是,则不要继续,并显示类似“未找到进程”的文本 我试过这样的方法: if ps -ef | grep xyz then echo "XYZ Process Found!" else echo "XYZ Process Not Found!" fi 但它只是向我显示进程并显示“process found”,即使没有xyz进程。我相
if ps -ef | grep xyz
then
echo "XYZ Process Found!"
else
echo "XYZ Process Not Found!"
fi
但它只是向我显示进程并显示“process found”,即使没有xyz进程。我相信您想根据一个值检查命令的输出,使用链接的bash黑客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
这更容易阅读。我相信您希望根据一个值检查命令的输出,使用链接的bash 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
这更容易阅读。当您运行
grep xyz
时,该进程-grep xyz
也在运行&因此显示在ps-ef
的输出中此正在运行的进程命令行包含
xyz
。因此,grep将该行传递给输出。因此,您始终获得零退出状态,即成功 2种解决方案:
;然后
。(您可能希望使用-q
抑制grep
输出)正在运行的grep命令是
grep[x]yz
。这将在ps-ef
输出中打印。显然,grep过滤掉了这一行
[x]yz
可以与\[x\]yz
匹配,而不是与[x]yz
匹配;然后
查看更多详细信息
当您运行
grep xyz
时,该进程-grep xyz
也在运行&因此显示在ps-ef
的输出中此正在运行的进程命令行包含
xyz
。因此,grep将该行传递给输出。因此,您始终获得零退出状态,即成功 2种解决方案:
;然后
。(您可能希望使用-q
抑制grep
输出)正在运行的grep命令是
grep[x]yz
。这将在ps-ef
输出中打印。显然,grep过滤掉了这一行
[x]yz
可以与\[x\]yz
匹配,而不是与[x]yz
匹配;然后
查看更多详细信息
您也可以使用
pgrep
。从pgrep(1)
:
pgrep查看当前运行的进程并列出
与标准输出匹配的进程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系统上广泛可用。您也可以使用pgrep
。从pgrep(1)
:
pgrep查看当前运行的进程并列出
与标准输出匹配的进程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系统上广泛可用。只有在我更改了=0到=1因为在ps-ef上,即使没有任何匹配项,它也会为每一组进程返回一个标头。@user1508682我首先在这里测试了它,当我使用它时,我得到了“process Found”1. <代码>ps--版本在此输出procps ng版本3.3.9。你有同样的吗?UUO*太多了<代码>如果ps-ef | grep-q[x]yz;然后其他的fi应该可以用。@anishsane不错的链接。你是对的,它提出了几种选择。我喜欢我在这里测试过的-c
。psgrep
在某些系统上是一个东西。只有我更改了=0到=1因为在ps-ef上,即使没有任何匹配项,它也会为每一组进程返回一个标头。@user1508682我首先在这里测试了它,当我使用它时,我得到了“process Found”1. <代码>ps--版本在此输出procps ng版本3.3.9。你有同样的吗?UUO*太多了<代码>如果ps-ef | grep-q[x]yz;然后其他的fi应该可以用。@anishsane不错的链接。你是对的,它提出了几种选择。我喜欢我在这里也测试过的-c
。psgrep
在某些系统上是一种东西。pgrep
通常是人们喜欢的。但是我更喜欢grep[x]yz版本。如果不想抑制输出,可以在屏幕上获取命令行。否则,您需要使用ps-f$(pgrep-fxyz)
。人们通常喜欢使用pgrep
。但是我更喜欢grep[x]yz版本。如果不想抑制输出,可以获取命令li