现在这很令人尴尬。我正在编写快速脚本,我无法弄清楚为什么这个语句不起作用。
if [ $(pidof -x test.sh | wc -w) -eq 1 ]; then echo Passed; fi
我也尝试使用反向刻度而不是$(),但它仍然不起作用。
你能看出它有什么问题吗?如果我在脚本中运行它,pidof -x test.sh | wc -w
会返回1,所以我看不出基本上if [ 1 -eq 1 ]
无法通过的原因。
非常感谢!
答案 0 :(得分:6)
#!/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"