Джефроми прав; вот логика, которая, я думаю, вам нужна:
#!/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..."
А, реальный ответ: когда вы используете конвейер, вы форсируете создание подоболочки. Это всегда будет приводить к увеличению числа:
#!/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 и подсчитывать их.
вам не нужно передавать результат pidof в wc
, чтобы подсчитать, сколько их ... используйте оболочку
r=$(pidof -x -o $$ test.sh)
set -- $r
if [ "${#@}" -eq 1 ];then
echo "passed"
else
echo "no"
fi
Вот как я бы это сделал:
if [ "`pgrep -c someprocess`" -gt "1" ]; then
echo "More than one process running"
else
echo "Multiple processes not running"
fi
Если вы используете опцию -o
, чтобы опустить PID скрипта ($$
), то будет учитываться только PID подшивки и любых других экземпляров скрипта (и любых подшивок, которые они могут породить), поэтому тест пройдет, когда есть только один экземпляр:
if [ $(pidof -x -o $$ test.sh | wc -w) -eq 1 ]; then echo Passed; fi