Як вийти з режиму `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, у якому, мабуть, недостатньо задокументований режим "слідування", ініційований Shift + F, і його можна чисто вийти з Q.
Toby Speight

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

Відповіді:


46

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

FYI, це кращий інструмент:

less +F filename

У цьому режимі lessви можете натиснути, Ctrl-Cщоб завершити режим вперед і прокрутити файл, а потім натиснути, Fщоб знову повернутися в режим вперед.

Зауважте, що less +Fбагато хто виступає за кращу альтернативуtail -f . Для різниці та застережень між двома інструментами, прочитайте цю відповідь: Чи "хвіст -f" більш ефективний, ніж "менше + F"?


7
Не по темі. ОП не просила "закінчити режим перемотки вперед і прокрутити файл". Швидше за все, ОП запитав, як вийти з хвоста -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:у своїх Makefiles - ми хочемо, щоб Make видаляла частково записані проміжні файли, коли дізнається, що одна з його команд отримала сигнал.
Toby Speight

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

1
Так, саме здатність захоплювати SIGINT саме тому я сказав, що хоче @Arthur. Не потрібно бути "приємним" до хвоста, ви не зашкодите це почуттям ^C:)
Josh

12

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

Ви не можете цього зробити. Можливо, ти захотів бігатиtail -f somefile | less

Ctrl cІнтерпретується підсистемою TTY (і вашої оболонкою) і посилає SIGINTсигнал (див сигнал (7) і PTY (7) ...). Див. Tty demystified .


6

Це спрацювало б і відповіло на ваше запитання, але не є надто задовільним рішенням.

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

Це запустить команду протягом 15 секунд, а потім знищить її, не натискаючи ^C


5
Так, так би спрацьовувало вимкнення комп'ютера tail. І все-таки ви не помиляєтесь, мабуть.
Аарон

5
Як закінчувати роботу tailSIGTERM краще, ніж припиняти її за допомогою SIGINT?
Дмитро Григор’єв

1
@DmitryGrigoryev Ви абсолютно праві - це не краще. Але ця відповідь безпосередньо відповідає на питання ОП, навіть якщо вона насправді не дуже корисна. Однак я використав тайм-аут, щоб припинити такі речі, як ping, коли використовую програму Java Dell DRAC Java, яка вимагає вибору меню для натискання клавіші 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.