как продолжить выполнение скрипта после команды tail -f

У меня есть следующий скрипт:

tail -f nohup.out
echo 5

Когда я нажимаю Ctrl+C на tail -f, скрипт перестает работать: 5 не печатается. Как запустить команду echo 5 после остановки команды tail?


person Richard    schedule 14.08.2012    source источник


Ответы (6)


Ctrl+C отправляет SIGINT сигнал всем процессам на переднем плане группе процессов. Пока работает tail, группа процессов состоит из процесса tail и оболочки, выполняющей скрипт.

Используйте встроенную функцию trap, чтобы переопределить поведение сигнала по умолчанию.

trap " " INT
tail -f nohup.out
trap - INT
echo 5

Код ловушки ничего не делает, поэтому оболочка переходит к следующей команде (echo 5), если она получает сигнал SIGINT. Обратите внимание, что в первой строке между кавычками есть пробел; подойдет любой шелл-код, который ничего не делает, за исключением пустой строки, которая будет означать полное игнорирование сигнала (это нельзя использовать, потому что это приведет к тому, что tail также будет игнорировать сигнал). Второй вызов trap восстанавливает поведение по умолчанию, так что после третьей строки Ctrl+C снова прерывает сценарий.

person Gilles 'SO- stop being evil'    schedule 14.08.2012

Вы можете просто запустить tail в новой оболочке, например:

#!/bin/bash
bash -i -c 'tail -f nohup.out'
echo 5
person rwos    schedule 14.08.2012

Как упоминалось rwos , но с добавлением встроенного захвата.

bash -i -c "trap ' ' SIGINT; tail -F '$1'; trap - SIGINT"

Это будет работать без закрытия сеанса шпатлевки при выдаче последующих сигналов SIGINT (это была моя проблема)

person Community    schedule 12.04.2016

В bash заканчивайте строку одним амперсандом, чтобы выполнить команду в фоновом режиме асинхронно.

tail -f nohup.out &
person Lazward    schedule 21.08.2020

Найдите File:Tail в Perl, несколько раз использовали его в разных проектах для автоматизации хвостовых журналов и выполнения определенного действия для вывода журнала.

google ftp-upload-mon проект, который я загрузил на sourceforge, который использует File:Tail to tail -f xferlogs

person V H    schedule 14.08.2012

person    schedule
comment
Вы не можете перехватить SIGKILL, здесь SIGKILL игнорируется. Это печатает только echo 5, если оболочка получает SIGINT или SIGTERM, а не если tail существует по какой-то другой причине (потому что файл не существует или потому что tail явно убит). Вы можете добавить псевдосигнал EXIT, но это не очень удобный способ указать, что echo 5 должно выполняться после tail. - person Gilles 'SO- stop being evil'; 14.08.2012