Jak wyjść z trybu `tail -f` bez użycia` Ctrl + c`?

22

Kiedy to zrobię tail -f filename, jak wyjść z trybu bez użycia, Ctrl+caby zabić proces?

To, czego chcę, to normalny sposób na wyjście, jak qw top.

Jestem ciekawy tego pytania, ponieważ uważam, że zabicie tego procesu nie jest dobrym sposobem na rzucenie czegoś.

Key Shang
źródło
23
tailnie jest interaktywny; nie przyjmuje poleceń.
muru
5
Istnieje również różnica między procesem zabijania za pomocą SIGTERM (domyślnie) i SIGKILL. SIGTERM „prosi” proces o zatrzymanie, a ten sygnał może być obsługiwany przez program. Z drugiej strony SIGKILL faktycznie zabija proces. Zobacz man signalwięcej
mrc02_kr,
9
Przesłanka tego pytania jest błędna. Ta specjalna postać nie „zabija” procesu tak, jak myślisz. Wysyła do niego sygnał przerwania , a nie sygnały zabicia lub zakończenia .
JdeBP
6
Całkowicie rozsądnie jest przerwać taillub nawet zabić go bez obaw. Ale jeśli chcesz alternatywy, zastanów się most, która ma wprawdzie niedostatecznie udokumentowany tryb „podążania”, zainicjowany za pomocą Shift + F, i może być czysto zakończony za pomocą Q.
Toby Speight
4
Problem polega na tym, że postrzegasz, że „zabicie procesu nie jest dobrym sposobem na rzucenie czegoś” - wysłanie ^ C do procesu jest jednym ze sposobów powiedzenia „Skończyłem z tobą i chciałbym, żebyś przestał”, to jest „default” droga do wyjścia z terminalu procesu w systemie Linux. Jeśli zdecydujesz się wyjść z jakiegoś długotrwałego procesu, konsekwencje twojego wyboru, aby go zatrzymać, mogą zostawić bałagan, ale tail -fczyż nie tak :)
Josh

Odpowiedzi:

46

Jak powiedziano w komentarzach, Ctrl-Cnie zabija tailprocesu, który odbywa się poprzez wysłanie sygnału SIGTERM lub SIGKILL (niesławny -9...); po prostu wysyła SIGINT, który mówi tailo zakończeniu trybu przekazywania i wyjściu.

Do Twojej dyspozycji, to lepsze narzędzie:

less +F filename

W trybie lessmożna nacisnąć, Ctrl-Caby zakończyć tryb przewijania do przodu i przewijać plik, a następnie nacisnąć, Faby ponownie wrócić do trybu przewijania.

Zauważ, że less +Fjest zalecany przez wielu jako lepsza alternatywa dlatail -f . Aby zapoznać się z różnicami i zastrzeżeniami między tymi dwoma narzędziami, przeczytaj tę odpowiedź: Czy „tail -f” jest bardziej wydajny niż „less + F”?

dr01
źródło
7
Poza tematem. OP nie poprosił o „zakończenie trybu przekazywania i przewijanie pliku”. Zamiast tego OP zapytał, jak wyjść z tail -f bez użycia Ctrl + C
fpmurphy
6
@ fpmurphy1 Biorąc pod uwagę, że przesłanka pytania PO jest niepoprawna ( tailnie została zabita przez CTRL-C i nie jest interaktywna), uważam, że moja odpowiedź jest bardziej niż właściwa.
dr01
11
@ fpmurphy1 Jeśli weźmiesz PO dosłownie tak, to jest to nie na temat, jednak wolę odpowiedzi edukacyjne, które rozwiązują nieporozumienia i jednocześnie udzielają odpowiedzi na to, co PO próbował faktycznie osiągnąć, tj. prawdziwe pytanie.
MarioDS
15
„Ctrl-C nie zabija procesu ogona” - Tak. A przynajmniej tyle, ile kill <pid>robi. W przypadku większości programów nie ma rzeczywistej różnicy między Ctrl-C(= SIGINT), SIGTERMa do pewnego stopnia SIGKILL. Domyślną czynnością dla wszystkich trzech jest po prostu zakończenie procesu, tak jakby exit()został wywołany, z tym wyjątkiem, że dla SIGKILLżadnego z trybów użytkownika powiązanych z nim nie exit()jest wywoływany (więc nie ma atexit()czyszczenia itp.). Ctrl-Ca SIGTERMw szczególności są całkowicie identyczne, chyba że program jednoznacznie je wyłapuje i na nie działa. Ogon GNU nie.
marcelm
4
@marcelm Zakończenie procesu nie jest tym samym, co exit()wywołanie. exit()uruchomi atexit()programy obsługi i wyczyści otwarte pliki stdio (co najważniejsze opróżnia bufory wyjściowe). Program SIGINTobsługi może to zrobić, ale większość programów nie przeszkadza; Nie wiem czy wie tail.
Barmar
14

To, czego chcę, to normalny sposób na wyjście, jak q u góry.

To jest ControlC:)

Jestem ciekawy tego pytania, ponieważ uważam, że zabicie tego procesu nie jest dobrym sposobem na rzucenie czegoś.

^C( ControlC) wysyła SIGINT do procesu, który jest zdefiniowany jako:

Sygnał SIGINT jest wysyłany do procesu przez jego terminal sterujący, gdy użytkownik chce przerwać proces

Właśnie to chcesz tutaj zrobić, to przerwać tail. Nie ma innego sposobu na osiągnięcie tego, co próbujesz zrobić („ładnie” rzucić ogon) i chociaż inne odpowiedzi umożliwiają zatrzymanie się tailna inne sposoby, nie są lepsze.

Naciśnięcie ^Cspowoduje próbę przerwania zadania w systemie Linux - jest to całkowicie normalne i jest to tylko „nie dobre”, jeśli proces ten znajduje się w środku czegoś i nie pozwalasz mu się zakończyć, a następnie jedyną „nie dobrą” stroną efektem pozostają rzeczy z tego procesu. Na przykład ^Cw środku makepolecenia pozostawia częściowo skompilowane oprogramowanie, ale to dobrze: dalszy ciąg makewyczyści to / wznowi tam, gdzie zostało przerwane.

Josh
źródło
2
W rzeczywistości makeprzykład jest przypomnieniem, dlaczego zawsze piszemy .DELETE_ON_ERROR:w naszych Makefile - chcemy, aby Make usunął częściowo zapisane pliki pośrednie, gdy dowie się, że jedno z jego poleceń otrzymało sygnał.
Toby Speight
Procesy mogą pułapkować SIGINTi przeprowadzać czyszczenie przed wyjściem, jak pokazano w .DELETE_ON_ERROR:przykładzie Toby'ego .
Wstrzymano do odwołania.
1
Tak, zdolność pułapkowania SIGINT jest dokładnie tym, dlaczego powiedziałem, że tego właśnie chce @Arthur. Nie trzeba być „ładnym” ogonem, nie skrzywdzisz jego uczuć ^C:)
Josh
12

tail -fnazwa pliku, jak wyjść z trybu bez użycia Ctrl cdo zabicia procesu

Nie możesz tego zrobić. Być może chciałeś biectail -f somefile | less

Ctrl cJest interpretowany przez podsystem tty (i przez powłokę) i wysyła SIGINTsygnał (patrz sygnał (7) oraz PTY (7) ...). Zobacz tty odszyfrowany .

Basile Starynkevitch
źródło
6

To działałoby i odpowiada na twoje pytanie, ale nie jest szczególnie zadowalającym rozwiązaniem.

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

Spowoduje to uruchomienie polecenia przez 15 sekund, a następnie zabicie go bez konieczności naciskania ^C

Criggie
źródło
5
Tak, więc wyłączanie komputera tailjest uruchamiane. Mimo wszystko nie mylisz się.
Aaron
5
W jaki sposób zakończenie tailz SIGTERM jest lepsze niż zakończenie z SIGINT?
Dmitrij Grigoryev,
1
@DmitryGrigoryev Masz całkowitą rację - nie jest lepiej. Ale ta odpowiedź bezpośrednio odpowiada na pytanie PO, mimo że tak naprawdę nie jest zbyt często używana w rzeczywistości. Jednak wykorzystałem limit czasu, aby zakończyć takie rzeczy jak ping, gdy korzystam z aplikacji Java DRAC Java, która wymaga wyboru menu w celu naciśnięcia klawisza Control i drugiego wyboru menu w celu zwolnienia kontroli (to było po prostu irytujące, Dell c5220 blade)
Criggie
0

Odpowiedzi różnią się w zależności od kontekstu. Aby wyjść z tail -f elegancko, potrzebujesz spustu. Załóżmy, że próbujesz monitorować wynik zadania, które zakończy się w pewnym momencie - może to być wyzwalacz.

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

W przeszłości korzystałem z podobnych pomysłów.

Cieszyć się.

navjit.brar
źródło