如果只有一个实例正在运行,请继续脚本

时间:2010-03-27 17:02:27

标签: bash if-statement

现在这很令人尴尬。我正在编写快速脚本,我无法弄清楚为什么这个语句不起作用。

if [ $(pidof -x test.sh | wc -w) -eq 1 ]; then echo Passed; fi

我也尝试使用反向刻度而不是$(),但它仍然不起作用。

你能看出它有什么问题吗?如果我在脚本中运行它,pidof -x test.sh | wc -w会返回1,所以我看不出基本上if [ 1 -eq 1 ]无法通过的原因。

非常感谢!

7 个答案:

答案 0 :(得分:6)

Jefromi是对的;这是我认为你想要的逻辑:

#!/bin/bash
# this is "test.sh"

if [ $(pidof -x test.sh| wc -w) -gt 2 ]; then 
    echo "More than 1"
    exit
fi

echo "Only one; doing whatever..."

答案 1 :(得分:3)

啊,真正的答案是:当你使用管道时,你强制创建一个子shell。这总会让你获得更多的数字:

#!/bin/bash

echo "subshell:"
np=$(pidof -x foo.bash | wc -w)
echo "$np processes"   # two processes

echo "no subshell:"
np=$(pidof -x foo.bash)
np=$(echo $np | wc -w)
echo "$np processes"   # one process

老实说,我不确定最简单的方法是做你真正想做的事。你可以通过创建一个锁文件来避免这一切 - 否则你可能需要通过ppid追溯到所有顶级进程并计算它们。

答案 2 :(得分:2)

你不必将pidof的结果传递给wc来计算有多少......使用shell

r=$(pidof -x -o $$ test.sh)
set -- $r
if [ "${#@}" -eq 1 ];then
 echo "passed"
else
 echo "no"
fi

答案 3 :(得分:1)

如果使用-o选项省略脚本的PID($$),则只显示子shell的PID和脚本的任何其他实例(以及它们可能产生的任何子shell)将被考虑,因此当只有一个实例时,测试将通过:

if [ $(pidof -x -o $$ test.sh | wc -w) -eq 1 ]; then echo Passed; fi

答案 4 :(得分:1)

我将如何做到这一点:

if [ "`pgrep -c someprocess`" -gt "1" ]; then
  echo "More than one process running"
else
  echo "Multiple processes not running"
fi

答案 5 :(得分:1)

如果你不想使用锁文件......你可以试试这个:

#!/bin/bash

if [[ "$(ps -N -p $$ -o comm,pid)" =~ $'\n'"${0##*/}"[[:space:]] ]]; then
    echo "aready running!"
    exit 1
fi

PS:可能需要调整一个奇怪的$ {0 ## * /}

答案 6 :(得分:0)

只检查是否存在任何一个(或多个)标识为test.sh的进程,如果没有找到,则返回代码为1:

pidof -x test.sh >/dev/null && echo "Passed"