使用ps检查正在运行的脚本数

时间:2010-12-17 18:25:16

标签: bash sh ps

我正在编写一个脚本(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 个答案:

答案 0 :(得分:6)

ps运行时,进程grep show_volume.sh也在运行,所以你总是算上grep!

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

pgrep对此任务也很有用,并且足够智能,可以始终排除自身。

答案 1 :(得分:1)

尝试排除grep,因为你的grep本身也包含show_volume.sh,一个例子

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

答案 2 :(得分:1)

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

pgrep -c

将显示计数而无需使用wc

答案 3 :(得分:0)

ajreal提供的解决方案:

ps -a | grep show_volume.sh | grep -v grep | wc -l <​​/ p>

应该有效。如果没有,请提供

的输出

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

这里