Как выйти из режима `tail -f` без использования` Ctrl + c`?


22

Когда я это сделаю tail -f filename, как выйти из режима без использования, Ctrl+cчтобы убить процесс?

То, что я хочу, это нормальный способ бросить курить, как qв top.

Мне просто интересно этот вопрос, потому что я чувствую, что убийство в процессе не является хорошим способом бросить что-то.


23
tailне является интерактивным; это не принимает команды.
Муру

5
Существует также разница между процессом уничтожения с помощью SIGTERM (по умолчанию) и SIGKILL. SIGTERM «просит» процесс остановиться, и этот сигнал может быть обработан программой. С другой стороны, SIGKILL фактически убивает процесс. Смотрите man signalбольше
mrc02_kr

9
Предпосылка этого вопроса ошибочна. Этот специальный персонаж не «убивает» процесс так, как вы думаете. Он посылает сигнал прерывания , а не сигналы уничтожения или завершения .
JdeBP

6
Совершенно разумно прервать tailили даже убить его, не беспокоясь. Но если вам нужна альтернатива, подумайте most, у которой есть
Toby

4
Проблема в том, что вы чувствуете, что «убить процесс - это не хороший способ выйти из чего-либо» - отправка ^ C процессу - это один из способов сказать: «Я закончил с вами, и я бы хотел, чтобы вы остановились», она является « по умолчанию» способ выхода из терминала процесса в Linux. Если вы решите выйти из какого-то длительного процесса, последствия по вашему выбору остановить его могут оставить беспорядок, но tail -fразве это не так :)
Джош

Ответы:


46

Как сказано в комментариях, Ctrl-Cне убивает tailпроцесс, который осуществляется путем отправки либо сигнала SIGTERM, либо SIGKILL (печально известного -9...); он просто отправляет сигнал SIGINT, который сообщает tailоб окончании режима пересылки и выходе.

К вашему сведению, это лучший инструмент:

less +F filename

В less, вы можете нажать , Ctrl-Cчтобы закончить режим вперед и прокручивать файл, а затем нажмите кнопку , Fчтобы снова вернуться в режим вперед.

Обратите внимание, что less +Fмногие выступают за лучшую альтернативуtail -f . Чтобы узнать разницу и предостережения между двумя инструментами, прочитайте этот ответ: Является ли `tail -f` более эффективным, чем` less + F`?


7
Не по теме. ОП не просил «завершить режим пересылки и пролистать файл». Вместо этого ОП спросил, как выйти из tail -f без использования Ctrl + C
fpmurphy

6
@ fpmurphy1 Учитывая, что предпосылка вопроса ОП неверна ( tailне уничтожена CTRL-C и не интерактивна), я считаю, что мой ответ более чем уместен.
dr01

11
@ fpmurphy1 Если вы воспринимаете ОП буквально, да, это не по теме, однако я предпочитаю образовательные ответы, которые устраняют недоразумения и в то же время дают ответ на то, чего ОП на самом деле пытался достичь, то есть на реальный вопрос.
MarioDS

15
«Ctrl-C не убивает процесс хвоста» - да, это так. Или хотя бы столько, сколько kill <pid>делает. Для большинства программ, нет никакой разницы между Ctrl-C(= SIGINT), SIGTERMи, в некоторой степени, SIGKILL. Действие по умолчанию для всех трех состоит в том, чтобы просто завершить процесс, как если бы exit()он был вызван, за исключением того, что для SIGKILL, ни один из кода пользовательского режима, связанного с, не exit()вызывается (так что никаких atexit()очисток и т. Д.). Ctrl-Cи SIGTERM, в частности, полностью идентичны, если только программа явно не ловит их и не действует на них. Хвост GNU не делает.
marcelm

4
@marcelm Завершение процесса - это не то же самое, exit()что вызов. exit()запустит atexit()обработчики и очистит открытые файлы stdio (наиболее важно очистить выходные буферы). SIGINTОбработчик мог бы сделать это, но большинство программ не беспокоить; Я не знаю, tailделает ли .
Бармар

14

То, что я хочу, это нормальный способ выйти, как q в верхней части.

Это ControlC:)

Мне просто интересно этот вопрос, потому что я чувствую, что убийство в процессе не является хорошим способом бросить что-то.

^C( ControlC) отправляет SIGINT процессу, который определяется как:

Сигнал SIGINT отправляется процессу его управляющим терминалом, когда пользователь желает прервать процесс

Это именно то, что вы хотите сделать здесь, это прерывание tail. Нет другого способа выполнить то, что вы пытаетесь сделать («красиво» бросить хвост), и, хотя другие ответы дают возможность остановиться tailдругими способами, они не лучше.

Нажатие ^Cпопытается прервать задачу в Linux - это совершенно нормально, и это только «не хорошо», если этот процесс находится в середине чего-то, а вы не позволяете ему завершиться, а затем единственная сторона «не хорошо» Эффект остается от вещей этого процесса. Как пример, ^Cв середине команды остается makeчастично скомпилированное программное обеспечение, но это нормально: дальнейший запуск makeочистит это / возобновит с того места, где он остановился.


2
На самом деле, этот makeпример является напоминанием о том, что мы всегда пишем .DELETE_ON_ERROR:в наших файлах Makefile - мы хотим, чтобы Make удалил частично записанные промежуточные файлы, когда он узнает, что одна из его команд получила сигнал.
Тоби Спейт

Процессы могут перехватывать SIGINTи очищать перед выходом, как показано в .DELETE_ON_ERROR:примере Тоби .
Приостановлено до дальнейшего уведомления.

1
Да, именно благодаря способности ловить SIGINT я и сказал, что этого хочет @Arthur. Не нужно быть «милым», чтобы хвастаться, вы не обидите его чувствами ^C:)
Джош

12

tail -fимя файла, как выйти из режима без использования, Ctrl cчтобы убить процесс

Вы не можете сделать это. Возможно, вы хотели бежатьtail -f somefile | less

Он Ctrl cинтерпретируется подсистемой tty (и вашей оболочкой) и отправляет SIGINTсигнал (см. Signal (7) и pty (7) ...). Смотри tty демистифицированный .


6

Это сработает и ответит на ваш вопрос, но не является особенно удовлетворительным решением.

timeout 15s tail -f /var/log/messages

Это запустит команду на 15 секунд, а затем убьет ее для вас, не нажимая ^C


5
Да, так будет и выключение компьютера tail. Тем не менее, вы не ошиблись, я думаю.
Аарон

5
Как завершить tailс SIGTERM лучше, чем завершить с SIGINT?
Дмитрий Григорьев

1
@DmitryGrigoryev Вы совершенно правы - не лучше. Но этот ответ прямо отвечает на вопрос ОП, хотя в действительности его не так много. Однако я использовал тайм-аут, чтобы прекратить такие вещи, как ping, при использовании Java-приложения Dell DRAC, которое требует выбора меню, чтобы нажать Control, и выбора второго меню, чтобы отключить управление (это было просто раздражающе, блейд Dell c5220)
Criggie

0

Ответы различаются в зависимости от контекста. Чтобы элегантно выйти из-под хвоста , вам понадобится триггер. Предположим, вы пытаетесь контролировать вывод задачи, которая завершится в определенный момент времени - это может стать вашим триггером.

task >& filename.log &
task_pid=$!
tail -f filename.log &
tail_pid=$!
while [ 1 ]
do
    # -0 is a special "poke" signal - "are you around?"
    kill -0 $task_pid
    if [ $? -eq 0 ]
    then
        # Original task is still alive.
        sleep 2
        continue
    fi
    kill -TERM $tail_pid
    break
done

Я использовал подобные идеи в прошлом.

Наслаждаться.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.