В общем, плохая идея попробовать простой подход ps
и grep
попытаться определить, запущен ли данный процесс.
Вам было бы гораздо лучше использовать pgrep
для этого:
if pgrep "varnish" >/dev/null; then
echo "Varnish in running"
else
echo "Varnish is not running"
fi
Смотрите руководство для pgrep
. В некоторых системах (возможно, не в Linux) вы получаете -q
флаг, соответствующий тому же флагу, для grep
которого избавляется от необходимости перенаправления /dev/null
. Также есть -f
флаг, который выполняет сопоставление в полной командной строке, а не только в имени процесса. Можно также ограничить соответствие процессами, принадлежащими конкретному пользователю, использующему -u
.
Установка pgrep
также дает вам доступ к pkill
которому позволяет сигнализировать о процессах на основе их имен.
Кроме того, если это демон службы , и если ваша система Unix имеет способ запрашивать у него информацию (например, работает ли она или нет), тогда это правильный способ проверки.
В Linux у вас есть systemctl
( systemctl is-active --quiet varnish
вернет 0, если он работает, 3 в противном случае), в OpenBSD у вас есть rcctl
и т. Д.
Теперь к вашему сценарию:
В вашем скрипте вы анализируете вывод из ps ax
. Этот вывод будет содержать имя самого скрипта check_varnish_pro.sh
, который, очевидно, содержит строку varnish
. Это дает вам ложный положительный результат. Вы бы заметили это, если бы тестировали его без -q
флага grep
.
#!/bin/bash
ps ax | grep '[v]arnish'
Запуск это:
$ ./check_varnish_pro.sh
31004 p1 SN+ 0:00.04 /bin/bash ./check_varnish_pro.sh
Другая проблема заключается в том, что, хотя вы пытаетесь «спрятать» grep
процесс от его обнаружения grep
, используя [v]
шаблон. Этот подход потерпит неудачу, если вам случится запустить скрипт или командную строку в каталоге, в котором указан файл или каталог varnish
(в этом случае вы снова получите ложное срабатывание). Это связано с тем, что шаблон не заключен в кавычки и оболочка будет выполнять с ним поиск по имени файла.
Видеть:
bash-4.4$ set -x
bash-4.4$ ps ax | grep [v]arnish
+ ps ax
+ grep '[v]arnish'
bash-4.4$ touch varnish
+ touch varnish
bash-4.4$ ps ax | grep [v]arnish
+ ps ax
+ grep varnish
91829 p2 SN+p 0:00.02 grep varnish
Наличие файла varnish
приведет к тому, что оболочка заменит [v]arnish
имя файла, varnish
и вы получите удар по шаблону в таблице процессов ( grep
процесс).