4

У меня есть выскочка конфигурации для службы, которая должна проверять наличие процесса при его запуске. Это звучит довольно легко, но я уже 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 ответ1

5

Как объяснено в руководстве, все скрипты запускаются с 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 .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .