У меня есть следующий скрипт:
tail -f nohup.out
echo 5
Когда я нажимаю Ctrl+C на tail -f
, скрипт перестает работать: 5
не печатается. Как запустить команду echo 5
после остановки команды tail
?
У меня есть следующий скрипт:
tail -f nohup.out
echo 5
Когда я нажимаю Ctrl+C на tail -f
, скрипт перестает работать: 5
не печатается. Как запустить команду echo 5
после остановки команды tail
?
Ctrl+C отправляет SIGINT сигнал всем процессам на переднем плане группе процессов. Пока работает tail
, группа процессов состоит из процесса tail
и оболочки, выполняющей скрипт.
Используйте встроенную функцию trap
, чтобы переопределить поведение сигнала по умолчанию.
trap " " INT
tail -f nohup.out
trap - INT
echo 5
Код ловушки ничего не делает, поэтому оболочка переходит к следующей команде (echo 5
), если она получает сигнал SIGINT. Обратите внимание, что в первой строке между кавычками есть пробел; подойдет любой шелл-код, который ничего не делает, за исключением пустой строки, которая будет означать полное игнорирование сигнала (это нельзя использовать, потому что это приведет к тому, что tail
также будет игнорировать сигнал). Второй вызов trap
восстанавливает поведение по умолчанию, так что после третьей строки Ctrl+C снова прерывает сценарий.
Вы можете просто запустить tail
в новой оболочке, например:
#!/bin/bash
bash -i -c 'tail -f nohup.out'
echo 5
Как упоминалось rwos , но с добавлением встроенного захвата.
bash -i -c "trap ' ' SIGINT; tail -F '$1'; trap - SIGINT"
Это будет работать без закрытия сеанса шпатлевки при выдаче последующих сигналов SIGINT (это была моя проблема)
В bash заканчивайте строку одним амперсандом, чтобы выполнить команду в фоновом режиме асинхронно.
tail -f nohup.out &
Найдите File:Tail в Perl, несколько раз использовали его в разных проектах для автоматизации хвостовых журналов и выполнения определенного действия для вывода журнала.
google ftp-upload-mon проект, который я загрузил на sourceforge, который использует File:Tail to tail -f xferlogs
echo 5
, если оболочка получает SIGINT или SIGTERM, а не если tail
существует по какой-то другой причине (потому что файл не существует или потому что tail
явно убит). Вы можете добавить псевдосигнал EXIT
, но это не очень удобный способ указать, что echo 5
должно выполняться после tail
.
- person Gilles 'SO- stop being evil'; 14.08.2012