Вот еще лучший способ написать это условие:
services=$(ps -e -o comm | grep -cFi "$SERVICE")
case "$services" in
(0)
# restart service
;;
(1)
# everything is fine
;;
(*)
# more than one copy is running
;;
esac
Используя ps -e -o comm
, вы избегаете глупых действий grep -v grep
, потому что в выводе ps отображается только фактическое имя процессане аргументы.И grep -cFi
подсчитывает совпадения и дает вам номер, так что вам не нужно иметь дело со статусом выхода из конвейера.
Кроме того, как подразумевали другие авторы, вы должны вести этот сценарийустановив переменную PATH
.
PATH=/bin:/usr/bin:/sbin:/usr/sbin
export PATH
Возможно, вы захотите или не захотите поставить /usr/local/bin
в начале этого списка, в зависимости от вашей системы.Не делайте этого, если вам ничего не нужно оттуда.
Последний совет: при написании сценариев, которые будут выполняться без надзора пользователя (например, заданий cron), будет хорошей идеей поставить set -e
в начале.Это приводит к тому, что они завершаются неудачно, если какая-либо команда не работает.