Jak zabić uciekającego kota?

128

Wiele razy przypadkowo uruchamiam catpolecenie na plikach zawierających do kilku tysięcy wierszy.

Próbuję zabić catpolecenie za pomocą Ctrl+ Club Ctrl+ Z, ale oba działają tylko po wyświetleniu całkowitej mocy wyjściowej catw terminalu, więc muszę poczekać, aż catzostanie całkowicie wykonane.

Czy istnieje lepsze rozwiązanie, które pozwala uniknąć oczekiwania? Ponieważ czasami pliki mają rozmiar do 100 MB i denerwujące jest czekać na nie.

Używam tcsh.

JigarGandhi
źródło
14
Używanie poleceń typu więcej, mniej, ogon, głowa może być interesującą alternatywą dla kota. (oczywiście nie jest to odpowiedź ...)
tonioc
25
To był największy tytuł pytania, jaki kiedykolwiek przeczytałem. Dopóki nie zobaczyłem, że to pytanie dotyczy UL, myślałem, że potrzebujesz pomocy w zabiciu uciekającego kota.
Lenz
5
Czy podwójne pytanie na pasku bocznym z innej witryny SE Z ulgą widzi logo „UL” obok pytania . Nieważne, kontynuuj. (zwykle Arquade ma tytuły pytań, które wyglądają bardzo źle poza kontekstem)
LindaJeanne
12
Spróbowałbym curiositypolecenia ...
Sekhemty
4
alias curiosity='sudo killall cat'
cas

Odpowiedzi:

76

Jeśli dane pliki zawierają naprawdę dużo danych, wysyłający sygnał może dostać się do catniego zanim się skończy. To, co naprawdę obserwujesz, to skończona prędkość twojego terminala - catwysyła dane do terminala i zajmuje to trochę czasu, zanim terminal wyświetli je wszystkie.

Pamiętaj, że zwykle musi on jakoś przerysować całe okno wyjściowe dla każdego wiersza wyjściowego (tj. Przesunąć zawartość okna o jeden wiersz w górę i wydrukować następny wiersz na dole). Chociaż istnieją techniki i algorytmy, które sprawiają, że jest to szybsze niż gdyby zrobiono to w prosty sposób, nadal zajmuje to trochę czasu.

Dlatego jeśli chcesz pozbyć się danych wyjściowych tak szybko, jak to możliwe, ukryj okno terminala , ponieważ wtedy zwykle nie następuje faktyczne przerysowanie. W środowisku graficznym może to oznaczać albo minimalizację okna, albo przejście do innego wirtualnego pulpitu, na konsoli wirtualnej Linux wystarczy przełączyć się na inny (( Ctrl+) Alt+ ).Fx

Zauważ również, że jeśli uruchomisz to przez wolne łącze sieciowe (na przykład SSH przez połączenie GSM), zdecydowanie zobaczysz znacznie mniej mocy wyjściowej, zanim zostaniesz catzabity przez sygnał, ponieważ prędkość terminala nie będzie już wąskim gardłem .

Peter
źródło
6
Jeśli czekasz na dane, aby zejść wolną rurą SSH, możesz użyć sekwencji ucieczki OpenSSH, aby zamknąć połączenie. W nowym wierszu wpisz, ~?aby zobaczyć dostępne opcje ( ~.zamyka się).
RJHunter
11
Próbujesz także zatrzymać wyjście za pomocą Ctrl + S, który wysyła tty-stop-output. Następnie możesz wysłać Ctrl + C. Aby wznowić wyświetlanie, naciśnij Ctrl + Q ...
Martin Tournoij
1
@Carpetsmoker Testowałem, że nie zatrzymałem przepływu tekstu dla mnie na Ubuntu 14.04 + terminator + zsh.
muru
@muru Thanks. Próbowałem to przetestować, ale nie byłem w stanie odtworzyć problemu (wydaje się, że mój system jest zbyt szybki, a może nie starałem się wystarczająco mocno).
Martin Tournoij,
4
@Carpetsmoker Obawiam się, że oprogramowanie do kontroli przepływu (którym jest Ctrl + S) nie pomoże w tym przypadku (szybkiego łącza terminali) - dane są już w buforze terminali i czekają, aż terminal je przetworzy. Dlatego Ctrl + S powie aplikacji, aby przestała wysyłać więcej danych, ale to, co już zostało wysłane, nadal będzie musiało zostać wyświetlone.
Peter
4

Konfiguracja terminala

Sądzę, że jest to bardziej związane ze sposobem skonfigurowania terminala, niż z jakimkolwiek problemem związanym z buforowaniem. Sprawdź wyjście stty -a | grep intr, powinieneś mieć intr = ^C;na linii wyjściowej, jeśli Ctrl- Cjest włączone na tty/ pty. Jeśli nie, możesz stty intr ^Cgo włączyć. Dodaj linię do swojego .tcshrclub, .loginaby stała się trwała (lub usuń linię, która zmienia ją w pierwszej kolejności!).

W przypadku niepowodzenia Ctrl- Cmożesz również spróbować wysłać za SIGQUITpomocą Ctrl- \. Jeśli to nie zadziała, ponownie sprawdź, stty -a | grep quitczy jest poprawnie skonfigurowane.

Konfiguracja emulatora terminala

Sprawdź także ustawienia emulatora terminala (jeśli go używasz), może być tak, że na tym poziomie jest ustawiony skrót (być może do kopiowania lub coś takiego) i Ctrl- Cnie osiąga ptypoziomu. Skrót można również skonfigurować gdzie indziej w środowisku pulpitu lub w systemie Windows.

Dobrym testem w systemie Linux, jeśli używasz emulatora terminali, jest przełączenie się na konsolę Linux ( Ctrl- Alt- F1), zalogowanie się tam i sprawdzenie, czy występuje to samo zachowanie. Jeśli nie, oznacza to, że problem leży w systemie Windows lub emulatorze terminali.

Może to być problem z opóźnieniem między odczytem danych z ptyurządzenia, jak sugeruje Peter . Ale jeśli jest to przypadek i faktycznie trzeba czekać minut na dane mają być wyświetlane, to z pewnością terminal emulator jest buforowanie sposób zbyt dużo danych (lub komputer jest bardzo powolny). Odpowiedzią byłoby znalezienie sposobu na zmniejszenie tego rozmiaru bufora w ustawieniach emulatora terminala lub użycie innego.

Dodatkowa wskazówka

Coś jeszcze warte dodania; Zwykle trafiam w niekontrolowaną catsytuację, gdy przypadkowo mam catplik binarny. Innym efektem tego może być zepsucie ustawień terminala (jeśli dane binarne pasują do różnych kodów ucieczki terminala, co często robi). Jeśli tputjest zainstalowany (zwykle jest to domyślnie), można uniknąć konieczności ponownego uruchomienia za pomocą następującego polecenia:

tput reset
Graeme
źródło
3

To właśnie tmuxopcja c0-change-intervali c0-change-triggerzaprojektowane. W każdym razie powinieneś użyć menedżera ekranu w celu wznowienia sesji.

J-16 SDiZ
źródło
1

Opcja Ctrl- jest Odostępna w systemie Unix od 110 dni transmisji. Uciekające polecenia kota zawsze stanowiły problem, gdy długi plik ASCII został zrzucony na wolne urządzenie wyjściowe, a cały plik umieszczony w buforze wyjściowym sterownika urządzenia. Ctrl- Orozpoczynałby opróżnianie bufora i kontynuację Ctrl- Owyłączałby opróżnianie, aby kot mógł być czytany z normalną prędkością. Ctrl- Ozostał wprowadzony, a cały plik opróżniłby się i szybko zwrócił wiersz polecenia.

Nie wiadomo, czy koderzy sterowników urządzeń Linux odczuwają potrzebę dodawania tej funkcji. Ta funkcja została dodana na poziomie sterownika urządzenia, gdzie Ctrl- Si Ctrl- Qmogła być tylko zaimplementowana. Użyłem tego, aby zrzucić duże przebiegi debugowania z dużą ilością wydruku czekowego, a następnie przewinąć w dół do miejsca, które chciałem zobaczyć.

użytkownik62612
źródło
Ctrl-O nie wydaje się być implementowany we współczesnych systemach Linux, a przynajmniej nie na serwerze RHEL lub Ubuntu.
dotancohen
-1

Korzystając z bash, możesz zawiesić zadanie za pomocą Ctrl+, Za następnie zabić je, używając PID lub postępując zgodnie z odpowiedziami z https://stackoverflow.com/questions/1624691/linux-kill-background-task (np. Kill -9 %%)

Jannis
źródło
3
ale używam tcshi Ctrl + Z nie działa ... już stwierdził, że to pytanie.
JigarGandhi
tak, przepraszam, nie przeczytałem w swoim poście, że próbowałeś Ctrl + Z i błędnie założyłem, że Ctrl + Z jest obsługiwany przez powłokę w przeciwieństwie do Ctrl + C obsługiwanego przez aplikację. Właśnie dlatego myślałem, że Ctrl + Z działa natychmiast, podczas gdy Ctrl + C nie.
Jannis
-1

otwórz nową konsolę, na przykład klikając ikonę konsoli lub naciskając Ctrl+ Alt+ F2. Tam wejdź

killall -9 cat

a kot zostanie zabity, chyba że masz przestarzałą blokadę NFS lub sytuację „nieprzerwanego snu” (czytaj na uszkodzonym sektorze bez ustawionego limitu czasu).

Thorsten Staerk
źródło
10
Problem nie tkwi w tym cat, że chodzi o to, catco napisano do terminala przed śmiercią i nie zostało odczytane, a co dopiero przetworzone lub wyświetlone przez emulator terminala (i siedzi w buforze (około 64 kB w systemie Linux) w sterowniku pty) .
Stéphane Chazelas
Następnie wypróbuj echo 3> / proc / sys / vm / drop_cache, które również upuszczą wiele buforów.
Thorsten Staerk
7
Nie, to tylko zrzuciłoby dane z pamięci podręcznej, a takie rzeczy nigdy nie wpłynęłyby na funkcjonalność!
Stéphane Chazelas
4
@ThorstenStaerk drop_cacheskontroluje strony używane przez jądro jako pamięć podręczną (zwykle dla systemu plików), a nie wewnętrzne bufory terminali, sterowniki sieciowe itp. - gdyby tak się stało, miałoby to dość poważne konsekwencje, jak zauważył Stéphane (w zasadzie straciłbyś dane) .
Peter
1
Czyż nie zabiliby killall -9 catteż innych instancji kota, które nadal mogłyby robić dobre rzeczy w innych wątkach procesu?
Joe
-7

Możesz spróbować z tym

Zresetuj użycie wyświetlacza -ctrlj

Jeśli cat nadal działa, otwórz nowy terminal i uruchom ten pkill -9 -f cat„To zabije wszystkie procesy kota”.

vembutech
źródło
Ctrl + J nie działa
JigarGandhi
26
pkill z „-f cat” jest dość niebezpieczny, ponieważ -f będzie szukał wzoru „cat” w całych liniach poleceń, co prawdopodobnie się zdarzy, i spowoduje niepożądane rezultaty ...
tonioc
2
Na przykład pkill -f catna moim pulpicie zabiłbym obszar zasobnika systemowego na pasku zadań Xfce4.
Mark