Проверьте количество запущенных скриптов, используя ps
Я пишу скрипт (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 ответа
В данный момент ps
запускает процесс grep show_volume.sh
также работает, так что вы всегда рассчитываете grep!
Простое решение, grep s[h]ow_volume.sh
, Grep (не shell) свернет [h]
в h
и искать то, что вы хотите, но ваш grep не будет совпадать сам по себе, потому что он будет иметь [] в параметре.
pgrep
также полезен для этой задачи и достаточно умен, чтобы всегда исключать себя.
Если вы запускаете скрипт от имени разных пользователей, тогда ps -a
будет показывать только экземпляры для текущего пользователя и только с подключенным терминалом. использование ps -ax
или же ps -e
,
pgrep -c
покажет счет без использования wc
,
Попробуйте также исключить grep, поскольку сам ваш grep также содержит show_volume.sh
, пример
ps -a | grep show_volume.sh | grep -v grep | wc -l
Решение, предоставленное ajreal:
пс-а | grep show_volume.sh | grep -v grep | туалет
должно сработать. Если это не так, пожалуйста, предоставьте вывод
пс-а | grep show_volume.sh | grep -v grep
Вот