bash syntax – команда обертывания внутри sudo :: tail logs до тех пор, пока строка не будет найдена с таймаутом с использованием Terraform

Цель: использование sudo выполнить одну строку cmd, чтобы задержать журнал до тех пор, пока строка не будет найдена, а затем не выйдет 0. Если строка не найдена в течение заданного таймаута, выйдите из ничего, кроме 0.

Попытка Решение 1. Первоначально у меня не было тайм-аута в качестве требования, и поэтому после некоторых исследований я приземлился на использование:

sudo sh -c '( tail -n1 -f /path/to/nameOfLog.log & ) | grep -q "Started .*Application"' 

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

Попытка Решение 2:

timeout 5 grep -q "Started .*Application" <(tail -n1 -f /path/to/nameOfLog.log &)

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

Попробуйте 1: (добавьте sudo перед cmd)

 sudo timeout 5 grep -q "Started .*Application" <(tail -n1 -f /path/to/nameOfLog.log &) 

Вывод:

 grep: /dev/fd/63: No such file or directory 

Попробуйте 2: (попробуйте обернуть cmd в подоболочку)

 sudo sh -c 'timeout 5 grep -q "Started .*Application" <(tail -n1 -f /path/to/nameOfLog.log &)' 

Вывод:

 sh: 1: Syntax error: "(" unexpected 

Может кто-нибудь, пожалуйста, покажите мне и объясните проблему и как ее исправить, чтобы я мог запускать эту команду с помощью sudo? Кроме того, мне действительно нужно реструктурировать cmd из Tryempted Solution 1, чтобы заставить его работать с таймаутом?

2 Solutions collect form web for “bash syntax – команда обертывания внутри sudo :: tail logs до тех пор, пока строка не будет найдена с таймаутом с использованием Terraform”

1) Я не уверен, полезен ли подсхей (или фон):

 sudo sh -c '( tail -n1 -f /path/to/nameOfLog.log & ) | grep -q "Started .*Application"' 

не должна ли простая труба?

 sudo sh -c 'tail -n1 -f /path/to/nameOfLog.log | grep -q "Started .*Application"' 

2) Ваша «попытка 1»:

 sudo timeout 5 grep -q "Started .*Application" <(tail -n1 -f /path/to/nameOfLog.log &) 

расширяет перенаправление ввода <() в командной строке, которая запускает sudo , а не внутри sudo . Открываемый файл-дескриптор не передается через sudo в grep , поэтому grep не может открыть псевдо-файл /dev/fd/63 .

То же самое и в отношении tail здесь, это не обязательно.


3) И, как прокомментировал phk , ваша «попытка 2»:

 sudo sh -c 'timeout 5 grep -q "Started .*Application" <(tail -n1 -f /path/to/nameOfLog.log &)' 

… явно запускает sh , а не bash или любую другую более функциональную оболочку. Обычный стандарт sh не поддерживает <() , и ни одна из них не используется, как sh на Debian и Ubuntu.

Когда вы запускаете su , он запускает root оболочку root , которая, вероятно, будет bash на Ubuntu. Но использование sudo и su избыточно, они оба сделаны для повышения привилегий, а после sudo вы уже используете повышенные привилегии , поэтому нет необходимости в su . Вместо этого, если вы хотите запустить оболочку внутри sudo , просто укажите явно, какой из них:

 sudo bash -c 'timeout 5 grep -q "Started .*Application" <(tail -n1 -f /path/to/nameOfLog.log &)' 

Найден ответ Александра Батищева для использования sudo su -c .

Решение (OLD):

 sudo su -c 'timeout 200 grep -q "Started .*Application" <(tail -n1 -f /path/to/nameOfLog.log &)' 

ОБНОВИТЬ:

Основываясь на ответе ilkkachu, я сделал еще несколько тестов и нашел новое решение.

  1. Во-первых, в ответ на ответ ilkkachu о sudo su , излишнем. Если я удалю sudo из команды, мне будет предложено ввести пароль.

  2. Во-вторых, в ответ на ответ ilkkachu о подоболочке не полезно. Это правда. Однако команда без подоболочки возвращается только в том случае, если журнал по какой-то причине активно записывается. В противном случае он зависает. При использовании подоболочки cmd возвращается, даже если журнал не записывается активно. Поэтому я предпочитаю команду subhell, но sh не поддерживает подоболочки.

    Кроме того, я заметил, что при тестировании в активном журнале использование использования bash vs. sh имеет разное время. По какой-то причине sh занимает секунду дольше, чтобы ответить тогда bash .

    По этим двум причинам (используя подоболочку и задержку в sh over bash ) я решил, что sh не подходит.

  3. В-третьих, в ответ на ответ ilkkachu относительно ненужного и для tail . Это правильно, я удалил его, и это не повлияло.

Резюме:

sudo su vs. su

 //prompts for password w/out sudo su -c 'timeout 200 grep -q "Started .*Application" <(tail -n100 -f /path/to/nameOfLog.log &)'' //works sudo su -c 'timeout 200 grep -q "Started .*Application" <(tail -n100 -f /path/to/nameOfLog.log &)' 

используя sh -c

 //either works (sudo or not using sudo) //but both won't work unless log is actively being written to for some reason sudo sh -c 'tail -n100 -f /path/to/nameOfLog.log | grep -q "Started .*Application"' sh -c 'tail -n100 -f /path/to/nameOfLog.log | grep -q "Started .*Application"' 

используя bash

 //either works (sudo or not using sudo) sudo bash -c 'timeout 5 grep -q "Started .*Application" <(tail -n100 -f /path/to/nameOfLog.log &)' bash -c 'timeout 5 grep -q "Started .*Application" <(tail -n100 -f /path/to/nameOfLog.log &)' 

Новое решение:

Я понял, что оставил одну важную деталь. Это то, что это выполнялось с помощью средства настройки удаленного сервера-ретранслятора terraform . Terraform создает локальный .sh-скрипт под / tmp / на сервере для любых встроенных команд. Коммуникатор / ssh / communicationator.go устанавливает #!/bin/sh в верхней части скриптов, что означает, что они используют sh . Поэтому, поскольку я использую подоболочку, мне нужно использовать bash. Использование sudo не является необходимым и было моим недоразумением. Однако вы все равно можете использовать sudo. Поэтому ответ, который я использовал, – это либо использование команд bash, перечисленных в приведенном выше резюме.

PS мои целевые серверы в этом случае выполняли 14.04.1-Ubuntu . Запуск ls -l /bin/sh показывает /bin/sh -> dash поэтому на самом деле я не использую sh но тире. Таким образом, dash имеет те же неудачи, что и sh .

  • Как получить вывод команды timeout без использования сценария оболочки
  • Tcpdump - подсчет исходящих и входящих пакетов UDP
  • Тайм-аут `idql` в ksh
  • тайм-аут вызывает, когда цикл чтения заканчивается, когда `cat` отключен
  • Linux и Unix - лучшая ОС в мире.