Kiedy to zrobię tail -f filename
, jak wyjść z trybu bez użycia, Ctrl+c
aby zabić proces?
To, czego chcę, to normalny sposób na wyjście, jak q
w top
.
Jestem ciekawy tego pytania, ponieważ uważam, że zabicie tego procesu nie jest dobrym sposobem na rzucenie czegoś.
tail
nie jest interaktywny; nie przyjmuje poleceń.man signal
więcejtail
lub 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.tail -f
czyż nie tak :)Odpowiedzi:
Jak powiedziano w komentarzach, Ctrl-Cnie zabija
tail
procesu, który odbywa się poprzez wysłanie sygnału SIGTERM lub SIGKILL (niesławny-9
...); po prostu wysyła SIGINT, który mówitail
o zakończeniu trybu przekazywania i wyjściu.Do Twojej dyspozycji, to lepsze narzędzie:
W trybie
less
moż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 +F
jest 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”?źródło
tail
nie została zabita przez CTRL-C i nie jest interaktywna), uważam, że moja odpowiedź jest bardziej niż właściwa.kill <pid>
robi. W przypadku większości programów nie ma rzeczywistej różnicy międzyCtrl-C
(=SIGINT
),SIGTERM
a do pewnego stopniaSIGKILL
. Domyślną czynnością dla wszystkich trzech jest po prostu zakończenie procesu, tak jakbyexit()
został wywołany, z tym wyjątkiem, że dlaSIGKILL
żadnego z trybów użytkownika powiązanych z nim nieexit()
jest wywoływany (więc nie maatexit()
czyszczenia itp.).Ctrl-C
aSIGTERM
w szczególności są całkowicie identyczne, chyba że program jednoznacznie je wyłapuje i na nie działa. Ogon GNU nie.exit()
wywołanie.exit()
uruchomiatexit()
programy obsługi i wyczyści otwarte pliki stdio (co najważniejsze opróżnia bufory wyjściowe). ProgramSIGINT
obsługi może to zrobić, ale większość programów nie przeszkadza; Nie wiem czy wietail
.To jest ControlC:)
^C
( ControlC) wysyła SIGINT do procesu, który jest zdefiniowany jako: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ętail
na inne sposoby, nie są lepsze.Naciśnięcie
^C
spowoduje 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^C
w środkumake
polecenia pozostawia częściowo skompilowane oprogramowanie, ale to dobrze: dalszy ciągmake
wyczyści to / wznowi tam, gdzie zostało przerwane.źródło
make
przykł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ł.SIGINT
i przeprowadzać czyszczenie przed wyjściem, jak pokazano w.DELETE_ON_ERROR:
przykładzie Toby'ego .^C
:)Nie możesz tego zrobić. Być może chciałeś biec
tail -f somefile | less
Ctrl cJest interpretowany przez podsystem tty (i przez powłokę) i wysyła
SIGINT
sygnał (patrz sygnał (7) oraz PTY (7) ...). Zobacz tty odszyfrowany .źródło
To działałoby i odpowiada na twoje pytanie, ale nie jest szczególnie zadowalającym rozwiązaniem.
Spowoduje to uruchomienie polecenia przez 15 sekund, a następnie zabicie go bez konieczności naciskania
^C
źródło
tail
jest uruchamiane. Mimo wszystko nie mylisz się.tail
z SIGTERM jest lepsze niż zakończenie z SIGINT?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.
W przeszłości korzystałem z podobnych pomysłów.
Cieszyć się.
źródło