Загалом, погана ідея спробувати простий підхід 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
процес).