【问题标题】:ps -ef | grep * command not working properlyps -ef | grep * 命令无法正常工作
【发布时间】:2021-01-20 04:15:53
【问题描述】:

我有如下简单的 unix shell 脚本。这对服务的计数不同

#!/bin/bash
service=$1

ps -ef | grep $service | grep -v "grep" | wc -l 
PROCESS_NUM=$(ps -ef | grep $service | grep -v "grep"| wc -l) 
echo $PROCESS_NUM

在上面的代码中,下面一行给出了 2 的输出。

ps -ef | grep $service | grep -v "grep" | wc -l 

但是当同一行被分配给变量时,其输出为 3。

PROCESS_NUM=$(ps -ef | grep $service | grep -v "grep"| wc -l) 
echo $PROCESS_NUM

为什么这会增加 1 以及如何解决它。

【问题讨论】:

  • 当您执行X=$(...) 时,您正在启动一个子shell 来执行命令,所以现在您拥有实际运行的东西以及带有命令行参数的shell 脚本和也提到该过程的子shell。您需要的是ps -ef | grep $service | grep -v "grep" | grep -v "$0" | wc -l,它将摆脱 shell 脚本及其子shell。
  • 它的工作。谢谢杰瑞 :)

标签: shell unix sh


【解决方案1】:

如果脚本在计算行数之前将输出发送到文件,然后在之后显示输出,您可以看到发生了什么:

#!/bin/bash
service=$1

echo Directly in Script:
ps -ef | grep $service | grep -v grep | tee test.txt | wc -l
cat test.txt

echo Inside Subshell:
RESULT=$(ps -ef | grep $service | grep -v grep | tee test.txt | wc -l)
echo $RESULT
cat test.txt

当捕获到命令的输出时,bash 会启动另一个 shell 来运行该命令 - 但该子 shell 也会显示在进程列表中。

当我运行该脚本时,我得到:

$ ./test.sh lca
Directly in Script:
2
gcti      4268     1  0  2018 ?        21:59:03 ./lca 4999
t816826   9159  7009  0 09:22 pts/1    00:00:00 /bin/bash ./test.sh lca
Inside Subshell:
3
gcti      4268     1  0  2018 ?        21:59:03 ./lca 4999
t816826   9159  7009  0 09:22 pts/1    00:00:00 /bin/bash ./test.sh lca
t816826   9166  9159  0 09:22 pts/1    00:00:00 /bin/bash ./test.sh lca

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    • 1970-01-01
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多