Проверить количество запущенных скриптов с помощью 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

здесь