我正在编写一个unix脚本,需要检查当前是否正在运行目录中有"xyz“的进程。如果是,请继续下一个命令,并显示类似于"Found“的文本。
如果没有继续并显示文本,如“未找到进程”。
我试过这样的方法:
if ps -ef | grep xyz
then
echo "XYZ Process Found!"
else
echo "XYZ Process Not Found!"
fi但它只是向我展示了进程,并显示了“过程找到”,即使没有xyz进程。
发布于 2015-01-13 14:39:48
我相信您希望使用命令颠覆检查命令的输出值,从链接的bash黑客wiki到命令替换扩展到命令的输出。这些命令在子These中执行,它们的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读起来容易多了。
发布于 2015-01-13 15:06:25
当您运行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。发布于 2015-01-13 15:11:41
您也可以使用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系统都可以使用。
https://stackoverflow.com/questions/27924568
复制相似问题