просмотреть журнал, используя найденные ключевые слова или время ожидания

Вы можете просто изменить всю строку, где появляется wal_level, включая #и произвольное количество пробелов:

sed '/^# *wal_level/cwal_level = archive' inputfile
3
14.08.2019, 12:36
3 ответа

Я нашел команду. Подробности в вопросе.

{ sed /"$keywords"/q; kill $!; } < <(exec timeout 1m tail -Fn 0 $log_file)

#!/bin/bashи set -euxo pipefailнеобходимы, если в сценарии, который должен выполняться bash, а не sh, хотя и связан с bashв CentOS.

1
27.01.2020, 21:20

Вы можете сделать что-то вроде:

sh -c 'echo "$$"; exec tail -f file' | (
  IFS= read -r pid
  timeout 60 sed "/$keyword/q"
  kill -s PIPE "$pid"
)

Если вы не включили опцию pipefail, она завершится со статусом выхода kill, который должен быть равен 0, если tailне вышел сам по себе (, чего на практике быть не должно ).

С pipefailэто приведет к выходу со статусом выхода tail, уничтоженным SIGPIPE, (который большинство оболочек представляют со значением 141 ). Вы всегда можете добавить || true, чтобы принудительно завершить статус успешного завершения.

См. также:

2
27.01.2020, 21:20

Я думаю, что здесь происходит состояние гонки. tail --pid=...зависит от tailпроверки и осознания того, что отслеживаемый PID умер до того, как он получит SIGPIPE (, обычно сигнал №. 13, что соответствует статусу выхода 128+13=141, который вы получили )при попытке записи в канал, прерванный завершением sed. В руководстве сказано только, что "вскоре после завершения этого процесса хвост также завершится", поэтому проверка может быть нечастой.

В любом случае, если tailбыл убит SIGPIPE, это означает, что (обычно)sedполучил нужную вам линию и вышел, так что также должно быть для вас условием успеха.. И я бы предложил относиться к этому именно так, используя блок ifдля защиты от set -eи явно проверяя статус выхода:

if timeout tail... | sed...; ret=$?; then
    : # do nothing, success
elif [ "$ret" != 141 ]  # not sigpipe, sed didn't quit, so failure
    exit "$ret"
fi

Помимо :, вы сказали, что скрипт использует #/bin/bash. Это должно быть #!с восклицательным знаком, а не просто #. Без этого сценарий будет запускаться с помощью sh, и, возможно, поэтому ваша попытка использовать подстановку процесса(<(...)— это процесс , а не команда, подстановка )является синтаксической ошибкой. Дважды проверьте это.

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

1
27.01.2020, 21:20

Теги

Похожие вопросы