Продолжите сценарий, если только один экземпляр работает? [дубликат]

6
задан jww 14 November 2017 в 00:23
поделиться

5 ответов

Джефроми прав; вот логика, которая, я думаю, вам нужна:

#!/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..."
6
ответ дан 8 December 2019 в 17:20
поделиться

А, реальный ответ: когда вы используете конвейер, вы форсируете создание подоболочки. Это всегда будет приводить к увеличению числа:

#!/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 и подсчитывать их.

3
ответ дан 8 December 2019 в 17:20
поделиться

вам не нужно передавать результат pidof в wc , чтобы подсчитать, сколько их ... используйте оболочку

r=$(pidof -x -o $$ test.sh)
set -- $r
if [ "${#@}" -eq 1 ];then
 echo "passed"
else
 echo "no"
fi
2
ответ дан 8 December 2019 в 17:20
поделиться

Вот как я бы это сделал:

if [ "`pgrep -c someprocess`" -gt "1" ]; then
  echo "More than one process running"
else
  echo "Multiple processes not running"
fi
1
ответ дан 8 December 2019 в 17:20
поделиться

Если вы используете опцию -o, чтобы опустить PID скрипта ($$), то будет учитываться только PID подшивки и любых других экземпляров скрипта (и любых подшивок, которые они могут породить), поэтому тест пройдет, когда есть только один экземпляр:

if [ $(pidof -x -o $$ test.sh | wc -w) -eq 1 ]; then echo Passed; fi
1
ответ дан 8 December 2019 в 17:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: