Я хочу, чтобы grep определенный статус службы (tomcat8.service).
Только если строка была найдена, я хочу выполнить некоторую логику.
Проблема: четная если я выполняю скрипт на имя службы, которого не существует («asd» в этом примере), if $status по-прежнему совпадает и распечатывается. Но почему?
status = $(systemctl status asd.service | grep 'active')
echo $status
if $status
then
echo "$SERVICE was active"
exit 0
fi
exit 0
Результат: asd.service was active, что, конечно же, неверно.
echo $status печатает: status: Unknown job: =
Вы можете использовать статус возврата grep.
systemctl status asd.service | grep 'active' \
&& status=active \
|| status=not_active
if [ "$status" == "active" ]; then
[...]
fi
или даже проще:
test $(systemctl status asd.service | grep 'active') \
&& echo "$SERVICE was active"
или если вы предпочитаете if:
if $(systemctl status asd.service | grep 'active'); then
echo "$SERVICE was active"
fi
В любом случае, обратите внимание на ключевые слова inactive, not active, active (exited) или аналогичные. Это также будет соответствовать вашему заявлению grep. См. Комментарии. Спасибо @ Terrance за подсказку.
Нет необходимости в grep. systemctl содержит команду is-active.
systemctl -q is-active asd.service \
&& echo "$SERVICE was active"
или:
if systemctl -q is-active asd.service; then
echo "is active";
fi
Вы можете использовать статус возврата grep.
systemctl status asd.service | grep 'active' \
&& status=active \
|| status=not_active
if [ "$status" == "active" ]; then
[...]
fi
или даже проще:
test $(systemctl status asd.service | grep 'active') \
&& echo "$SERVICE was active"
или если вы предпочитаете if:
if $(systemctl status asd.service | grep 'active'); then
echo "$SERVICE was active"
fi
В любом случае, обратите внимание на ключевые слова inactive, not active, active (exited) или аналогичные. Это также будет соответствовать вашему заявлению grep. См. Комментарии. Спасибо @ Terrance за подсказку.
Нет необходимости в grep. systemctl содержит команду is-active.
systemctl -q is-active asd.service \
&& echo "$SERVICE was active"
или:
if systemctl -q is-active asd.service; then
echo "is active";
fi
Вы можете использовать статус возврата grep.
systemctl status asd.service | grep 'active' \
&& status=active \
|| status=not_active
if [ "$status" == "active" ]; then
[...]
fi
или даже проще:
test $(systemctl status asd.service | grep 'active') \
&& echo "$SERVICE was active"
или если вы предпочитаете if:
if $(systemctl status asd.service | grep 'active'); then
echo "$SERVICE was active"
fi
В любом случае, обратите внимание на ключевые слова inactive, not active, active (exited) или аналогичные. Это также будет соответствовать вашему заявлению grep. См. Комментарии. Спасибо @ Terrance за подсказку.
Нет необходимости в grep. systemctl содержит команду is-active.
systemctl -q is-active asd.service \
&& echo "$SERVICE was active"
или:
if systemctl -q is-active asd.service; then
echo "is active";
fi
Некоторые комментарии по обзору кода:
присвоения переменных sh / bash / ksh / zsh выглядят как var=value - не допускаются пробелы вокруг =. (документация) status=$(some command) - переменная статуса удерживает вывод команды, а не статус выхода. Статус выхода находится в переменной $?, оператор if действует на статус выхода следующей команды (документация)if some_comment; then action1; else action2; fi
. Чаще всего команда [ или [[ проверяет какое-либо условие. Однако grep имеет четкий статус выхода: 0, если шаблон найден, 1 в противном случае. Поэтому вы хотите: if systemctl status asd.service | grep -q 'active'; then
echo "$SERVICE was active"
fi
Некоторые комментарии по обзору кода:
присвоения переменных sh / bash / ksh / zsh выглядят как var=value - не допускаются пробелы вокруг =. (документация) status=$(some command) - переменная статуса удерживает вывод команды, а не статус выхода. Статус выхода находится в переменной $?, оператор if действует на статус выхода следующей команды (документация)if some_comment; then action1; else action2; fi
. Чаще всего команда [ или [[ проверяет некоторые условия. Однако grep имеет четкий статус выхода: 0, если шаблон найден, 1 в противном случае. Поэтому вы хотите: if systemctl status asd.service | grep -q 'active'; then
echo "$SERVICE was active"
fi
Некоторые комментарии по обзору кода:
присвоения переменных sh / bash / ksh / zsh выглядят как var=value - не допускаются пробелы вокруг =. (документация) status=$(some command) - переменная статуса удерживает вывод команды, а не статус выхода. Статус выхода находится в переменной $?, оператор if действует на статус выхода следующей команды (документация)if some_comment; then action1; else action2; fi
. Чаще всего команда [ или [[ проверяет какое-либо условие. Однако grep имеет четкий статус выхода: 0, если шаблон найден, 1 в противном случае. Поэтому вы хотите: if systemctl status asd.service | grep -q 'active'; then
echo "$SERVICE was active"
fi