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,

Другие вопросы по тегам