Проверьте количество запущенных скриптов, используя ps - PullRequest
2 голосов
/ 17 декабря 2010

Я пишу скрипт (show_volume.sh), который можно вызывать несколько раз за короткие промежутки времени.Мне нужен способ определить, существует ли более одного запущенного экземпляра этого скрипта.Я решил, что могу использовать 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

и запустил этот скрипт один раз, но выводecho $PCOUNT не имеет никакого смысла для меня.Я всегда получаю значение 2, а не 1, как и ожидалось.Когда я запускаю эту команду

ps -a | grep show_volume.sh | wc -l

с другого терминала во время работы скрипта, я получаю значение 1. Это почти то же самое, когда я запускаю этот скрипт несколько раз подрядНапример, 10 раз, используя цикл for.Сам скрипт определяет значения, которые слишком высоки, в то время как я получаю правильные значения при использовании другого терминала.

Теперь, почему этот скрипт определяет эти нечетные значения?

Ответы [ 4 ]

6 голосов
/ 17 декабря 2010

В данный момент ps запускается процесс grep show_volume.sh также выполняется, поэтому вы всегда учитываете grep!

Простое решение, grep s[h]ow_volume.sh.Grep (не shell) свернет значения [h] до h и выполнит поиск того, что вы хотите, но ваш grep не будет соответствовать самому себе, потому что в параметре будет [].также полезен для этой задачи и достаточно умен, чтобы всегда исключать себя.

1 голос
/ 18 декабря 2010

Если вы запускаете скрипт от имени разных пользователей, то ps -a будет показывать только экземпляры для текущего пользователя и только те, у кого есть подключенный терминал. Используйте ps -ax или ps -e.

pgrep -c

покажет счет без использования wc.

1 голос
/ 17 декабря 2010

Попробуйте также исключить grep, поскольку сам ваш grep также содержит show_volume.sh, пример

ps -a | grep show_volume.sh | grep -v grep | wc -l
0 голосов
/ 08 марта 2011

Решение, предоставленное ajreal:

пс -a | grep show_volume.sh | grep -v grep | wc -l

должно работать. Если это не так, предоставьте вывод

пс -a | grep show_volume.sh | grep -v grep

здесь

...