Создание отрицательного предпросмотра в команде pgrep / pkill внутри сложной команды UNIX

Обновить

April 2019

Просмотры

213 раз

1

Я пишу демон, который будет входить в другие машины, чтобы убедиться, что служба работает, а также запускать, останавливать, или убить его. Из-за этого, команды UNIX получить немного долго и запутанным.

Основная форма команд, которые формируются подобны:

bash -c 'ssh -p 22 [email protected] pgrep -fl "APP.*APP_id=12345"'

Где APP является именем удаленного исполняемого файла и APP_ID является параметр передается приложению при запуске.

Исполняемый работает на удаленной стороне будет запущен с чем-то вроде:

/path/to/APP configs/config.xml -v APP_id=12345 APP_port=2345 APP_priority=7

Статус завершения этой команды используется для определения, если удаленный сервис работает или был успешно запущен или убит.

Проблема у меня в том, что при тестировании на моей локальной машине, SSH подключается к локальной машине, чтобы сделать вещи проще, но pgrep назвал этот путь будет также определить команду SSH, что сервер работает, чтобы сделать чек.

Например, pgrep может вернуться:

26308 ./APP configs/config.xml APP_id=128bb8da-9a0b-474b-a0de-528c9edfc0a5 APP_nodeType=all APP_exportPort=6500 APP_clientPriority=11
27915 ssh -p 22 [email protected] pgrep -fl APP.*APP_id=128bb8da-9a0b-474b-a0de-528c9edfc0a5

Таким образом, следующий логический шаг был изменить шаблон pgrep исключить «SSH», но это кажется невозможным, потому что pgrep, кажется, не быть скомпилировано с версией PCRE, которая позволяет lookaheads, например:

bash -c -'ssh -p 22 [email protected] preg -fl "\(?!ssh\).*APP.*APP_id=12345"

Это будет бросать регулярки ошибки, так как обходной путь я использовал Grep:

bash -c 'ssh -p 22 [email protected] pgrep -fl "APP.*APP_id=12345" \\| grep -v ssh'

Это хорошо работает для запросов с pgrep несмотря на то, что это временное решение. Однако, следующий шаг с использованием pkill не работает, потому что нет никакой возможности для Grep, чтобы быть эффективным:

bash -c 'ssh -p 22 [email protected] pkill -f "APP.*APP_id=12345"'

Не работает хорошо, потому что pkill также убивает соединение SSH, который вызывает состояние выхода, чтобы быть плохим. Итак, я вернулся к модификации моего pgrep / шаблон pkill и не имея много удачи.

Эта среда может быть смоделировано с чем-то простым на локальной машине, которая может SSH к себе без пароля (в этом случае приложение будет «смотреть»):

watch echo APP_id=12345

Вот вопрос просто поставить: Как соответствовать «APP» , но не «SSH пользователь @ хост APP» в pgrep?

1 ответы

1

It's kind of a workaround, but does the job:

bash -c 'ssh -p 22 [email protected] pgrep -fl "^[^\s]*APP.*APP_id=12345"'

...which only matches commands that have no space before the application name. This isn't entirely complete, because it's possible that the path to the executable may contain a directory with spaces, but without lookaround syntax I haven't thought of another way to make this work.

Связанные вопросы