grep терпит неудачу в сценарии выскочки
У меня есть выскочка конфигурации для службы, которая должна проверять наличие процесса при его запуске. Это звучит довольно легко, но я уже 3 часа пытаюсь решить эту проблему, и я заблудился. Кажется, проблема в том, что некоторые операторы grep приводят к выходу скрипта из upstart, что приводит к сбою при запуске сервиса. Но выскочка ничего не регистрирует, она просто выходит из сценария и исчезает.
Ниже приведены несколько примеров строк, которые вызывают проблему: первое эхо и выходные данные его grep регистрируются, второе эхо регистрируется, но не выводятся его grep. После второго выскочка эха просто выходит из скрипта и останавливается. Проблема заключается в добавлении опции -v или чего-то другого, например, использования классов регулярных выражений, таких как [[:digit:]]. Кажется, мне нужно убежать от некоторых персонажей, но я просто не знаю как. Простое -v или что-то подобное не работает.
script
echo grep
ps ax | grep "postgres: wal writer process" | grep "grep"
echo grep2
ps ax | grep "postgres: wal writer process" | grep -v "grep"
end script
У кого-нибудь есть идеи о том, что я делаю неправильно и как решить проблему?
1 ответ
Как объяснено в руководстве, все сценарии работают с sh -e
, Это означает, что любой необработанный сбой команды завершит работу сценария с ошибкой. Если у вас есть код, который может вернуть ошибку, вы должны кодировать его как
command || true
или оберните это в условное или что-то.
Кстати, ваш код лучше написан как
ps ax | grep "[p]ostgres: wal writer process"
Смотрите также https://stackoverflow.com/questions/9375711/more-elegant-ps-aux-grep-v-grep
Итак, в заключение, вы, вероятно, искали бы что-то вроде
if ps aux | grep '[p]ostgres: wal writer process'
then
: already running
else
: start it up
fi
Теперь, когда grep
выполняется как часть условия, ошибка больше не считается необработанной (даже если у вас нет else
пункт!) и так будет безопасно работать под set -e
,