2

我正在编写一个脚本(show_volume.sh),它可能会在短时间内被调用多次。我需要一种方法来确定该脚本是否有多个正在运行的实例。我想我可以使用ps,所以我在 Bash 中编写了这个函数:

is_only_process(){
    PCOUNT=`ps -a | grep show_volume.sh | wc -l`
    echo $PCOUNT
    if (( PCOUNT==1 )); then
        return 1 
    fi  
    return 0
}

所以我添加了这两行

is_only_process
sleep 4

并启动了这个脚本一次,但输出echo $PCOUNT对我来说没有任何意义。正如预期的那样,我总是得到值 2,而不是 1。当我运行这个命令

ps -a | grep show_volume.sh | wc -l

在脚本运行时从另一个终端收到值 1。当我连续多次运行此脚本时几乎相同,例如使用 for 循环运行 10 次。当我在使用另一个终端时收到正确的值时,脚本本身会确定过高的值。

现在,为什么这个脚本会确定这些奇数值?

4

4 回答 4

6

此刻ps运行一个进程grep show_volume.sh也在运行,所以你总是算 grep!

简单的解决方案,grep s[h]ow_volume.sh。grep(不是 shell)将折叠[h]toh并搜索您想要的内容,但您的 grep 不会匹配自身,因为它的参数中有 []。

pgrep对于此任务也很有用,并且足够聪明,可以始终将自己排除在外。

于 2010-12-17T18:28:20.903 回答
2

如果您以不同用户的身份运行脚本,则ps -a只会显示当前用户的实例,并且只会显示带有附加终端的用户。使用ps -axps -e

pgrep -c

将显示计数而无需使用wc.

于 2010-12-18T01:46:28.993 回答
1

尝试排除 grep ,因为您的 grep 本身也包含show_volume.sh,例如

ps -a | grep show_volume.sh | grep -v grep | wc -l
于 2010-12-17T18:27:55.757 回答
0

ajreal提供的解决方案:

ps -a | grep show_volume.sh | grep -v grep | wc -l

应该管用。如果没有,请提供输出

ps -a | grep show_volume.sh | grep -v grep

这里

于 2011-03-08T15:01:16.803 回答