2016-09-19 2 views
1

Проходя ответы по superuser.Хвост файла до выхода процесса

Я пытаюсь изменить это, чтобы прослушивать несколько строк и эхо-пользовательские сообщения, такие как; «Ваш сервер успешно запущен» и т.д.

Я также пытается лавировать его в другую команду т.е. пип

wait_str() { 
    local file="$1"; shift 
    local search_term="Successfully installed"; shift 
    local search_term2='Exception' 
    local wait_time="${1:-5m}"; shift # 5 minutes as default timeout 

    (timeout $wait_time tail -F -n0 "$file" &) | grep -q "$search_term" && echo 'Custom success message' && return 0 || || grep -q "$search_term2" && echo 'Custom success message' && return 0 

    echo "Timeout of $wait_time reached. Unable to find '$search_term' or '$search_term2' in '$file'" 
    return 1 
} 

Использование я имею в виду:

pip install -r requirements.txt > /var/log/pip/dump.log && wait_str /var/log/pip/dump.log 

Чтобы уточнить, я Мне бы хотелось, чтобы wait_str остановил хвост, когда выйдет pip, успешно или нет.

+0

@PS. Команда 'tail' не выходит. Мне нужно сделать это так: 'tail -f /var/log/pip/stderr.log | awk '/ Exception/{system ("echo work!")}' || awk '/ compiler/{system ("echo work!")}' 'для проверки двух строк. – Jonathan

+0

Предполагается, что эти команды выполняются параллельно, но ваши команды показывают серийное выполнение. По определению 'pip' будет завершен, когда' wait_str' будет запущен, потому что вы соединяете их с '&&', который ждет 'pip' и проверяет его статус выхода, а затем запускает' wait_str', только если 'pip' был успешным. – tripleee

ответ

3

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

IF разные строки необходимо различные действия используйте следующее:

tail -f var/log/pip/dump.log |awk '/condition1/ {action for condition-1} /condition-2/ {action for condition-2} .....' 

Если несколько условий нужно же действие их, разделите их с помощью оператора ИЛИ:

tail -f var/log/pip/dump.log |awk '/condition-1/ || /condition-2/ || /condition-n/ {take this action}' 

На основе замечаний: Single awk может это сделать.

tail -f /path/to/file |awk '/Exception/{ print "Worked"} /compiler/{ print "worked"}' 

или

tail -f /path/to/file | awk '/Exception/||/compiler/{ print "worked"}' 

ИЛИ Выход, если совпадение найдено

tail -f logfile |awk '/Exception/||/compiler/{ print "worked";exit}' 
+0

Спасибо! Просто испытал это, он работает. Я вызываю хвост из скрипта, и мне нужно его выйти, чтобы выполнение скрипта продолжалось. – Jonathan

+0

Это '(tail -f -n0 logfile.log &) | grep -q «Server Started» «это выходит из конвейера, когда строка найдена (скопирована с сайта суперпользователя). Я никогда не использовал awk, есть ли подобная опция, которая позволит выйти после того, как будет найдена строка? – Jonathan

+2

Да, действительно, вы можете выйти из awk после того, как будет найдена строка. Используйте exit после утверждения печати внутри awk, например: 'awk '/ Exception/||/compiler/{print" work "; exit}'' –