Проверить количество запущенных скриптов с помощью ps
Я пишу script (show_volume.sh), который можно вызвать несколько раз за короткие промежутки времени. Мне нужен способ определить, есть ли только один запущенный экземпляр этого script. Я решил, что могу использовать 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
}
Итак, я добавил эти 2 строки
is_only_process
sleep 4
и начал этот script один раз, но вывод echo $PCOUNT
не имеет для меня никакого смысла. Я всегда получаю значение 2, а не 1, как и ожидалось. Когда я запускаю эту команду
ps -a | grep show_volume.sh | wc -l
с другого терминала, пока выполняется script, я получаю значение 1.
Это почти так же, когда я запускаю этот script несколько раз подряд, например. 10 раз, используя цикл for. Сам script определяет слишком высокие значения, пока я получаю правильные значения при использовании другого терминала.
Теперь, почему этот script определяет эти нечетные значения?
Ответы
Ответ 1
В настоящий момент выполняется ps
процесс grep show_volume.sh
, поэтому вы всегда считаете grep!
Простое решение, grep s[h]ow_volume.sh
. Grep (а не оболочка) скроет [h]
до h
и ищет то, что вы хотите, но ваш grep не будет соответствовать самому себе, потому что он будет иметь [] в параметре.
pgrep
также полезен для этой задачи и достаточно умен, чтобы всегда исключать себя.
Ответ 2
Попробуйте также исключить grep, так как сам grep также содержит show_volume.sh
, пример
ps -a | grep show_volume.sh | grep -v grep | wc -l
Ответ 3
Если вы используете script как разные пользователи, тогда ps -a
будет показывать только экземпляры для текущего пользователя и только те, у которых есть подключенный терминал. Используйте ps -ax
или ps -e
.
pgrep -c
покажет счет без использования wc
.
Ответ 4
Решение, предоставляемое ajreal:
ps -a | grep show_volume.sh | grep -v grep | wc -l
должен работать. Если это не так, укажите вывод
ps -a | grep show_volume.sh | grep -v grep
здесь