Wiele razy przypadkowo uruchamiam cat
polecenie na plikach zawierających do kilku tysięcy wierszy.
Próbuję zabić cat
polecenie za pomocą Ctrl+ Club Ctrl+ Z, ale oba działają tylko po wyświetleniu całkowitej mocy wyjściowej cat
w terminalu, więc muszę poczekać, aż cat
zostanie 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
.
curiosity
polecenia ...alias curiosity='sudo killall cat'
Odpowiedzi:
Jeśli dane pliki zawierają naprawdę dużo danych, wysyłający sygnał może dostać się do
cat
niego zanim się skończy. To, co naprawdę obserwujesz, to skończona prędkość twojego terminala -cat
wysył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
cat
zabity przez sygnał, ponieważ prędkość terminala nie będzie już wąskim gardłem .źródło
~?
aby zobaczyć dostępne opcje (~.
zamyka się).tty-stop-output
. Następnie możesz wysłać Ctrl + C. Aby wznowić wyświetlanie, naciśnij Ctrl + Q ...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 natty
/pty
. Jeśli nie, możeszstty intr ^C
go włączyć. Dodaj linię do swojego.tcshrc
lub,.login
aby 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
SIGQUIT
pomocą Ctrl- \. Jeśli to nie zadziała, ponownie sprawdź,stty -a | grep quit
czy 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
pty
poziomu. 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
pty
urzą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ą
cat
sytuację, gdy przypadkowo mamcat
plik 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ślitput
jest zainstalowany (zwykle jest to domyślnie), można uniknąć konieczności ponownego uruchomienia za pomocą następującego polecenia:źródło
To właśnie
tmux
opcjac0-change-interval
ic0-change-trigger
zaprojektowane. W każdym razie powinieneś użyć menedżera ekranu w celu wznowienia sesji.źródło
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ć.
źródło
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 %%)
źródło
tcsh
i Ctrl + Z nie działa ... już stwierdził, że to pytanie.otwórz nową konsolę, na przykład klikając ikonę konsoli lub naciskając Ctrl+ Alt+ F2. Tam wejdź
a kot zostanie zabity, chyba że masz przestarzałą blokadę NFS lub sytuację „nieprzerwanego snu” (czytaj na uszkodzonym sektorze bez ustawionego limitu czasu).
źródło
cat
, że chodzi o to,cat
co 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) .drop_caches
kontroluje 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) .killall -9 cat
też innych instancji kota, które nadal mogłyby robić dobre rzeczy w innych wątkach procesu?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”.źródło
pkill -f cat
na moim pulpicie zabiłbym obszar zasobnika systemowego na pasku zadań Xfce4.