tmux wolno przerywa proces za pomocą Ctrl-C

25

Jeśli uruchomię polecenie z dużą ilością danych wyjściowych w tmux, ale zdecyduję się je anulować za pomocą Ctrl-C, opóźnienie wynosi 10-15 sekund. Jeśli jednak zrobię to samo poza tmux, natychmiast się zatrzyma. Dlaczego tak jest i czy można to naprawić?

W praktyce ten problem pojawia się, gdy robię grep -Rduży katalog, a moje wyszukiwanie nie jest wystarczająco ograniczone. Obejściem tego problemu byłoby przesunięcie wyniku w wcpierwszej kolejności, aby upewnić się, że wynik nie jest zbyt długi, ale to tylko kolejny krok, którego chciałbym uniknąć.


Uwagi:

  • Zachowuje się tak samo w Gnome Terminal, uxterm, st i zwykłym wirtualnym terminalu (np. Ctrl-alt-f2), ale opóźnienie jest mniejsze w zwykłym wirtualnym terminalu.
  • Nie jestem jedyny: http://www.mail-archive.com/[email protected]/msg01569.html
  • Opóźnienie jest dłuższe, jeśli moje okno terminala jest większe. W przypadku terminala pełnoekranowego zatrzymanie grep -R(bez innych argumentów) zajmuje około 15 sekund w zaśmieconym katalogu domowym. W przypadku terminala o wymiarach 80 × 25 zatrzymuje się niemal natychmiast.
Śnieżna kula
źródło
Nie zauważam żadnej zauważalnej różnicy. Próbowałem grep -R "a" ~/(nie zapisuję do pliku) ... a yes | nl | cut -f1 | head -9999999 > ~/filepotem cat ~/file.
Peter.O,
@ Peter.O Wystarczy wpisać „tak”, a następnie nacisnąć Enter, tmux jest skazany na zagładę.
solotim,

Odpowiedzi:

10

tmux ma teraz następujące opcje:

c0-change-interval interval
c0-change-trigger trigger

Możesz ustawić dla nich wartości, które ułatwią pisanie ^ C i znajomych. Zobacz man tmux:

Te dwie opcje konfigurują prostą formę ograniczenia prędkości dla panelu. Jeśli tmux widzi więcej niż spustowych sekwencji C0 modyfikujących ekranu (na przykład, wysyłki lub zwrotów, karetki przesuwa kursor) w jednej milisekundy zostanie zatrzymane natychmiast aktualizacji panelu i zamiast narysować go całkowicie co interwał milisekund. Pomaga to uniknąć szybkiego zapełnienia terminala (np. Tak (1)). Wartość domyślna to wyzwalacz 250 i odstęp 100. Wyzwalacz zerowy wyłącza ograniczenie prędkości.

ThomasAdam
źródło
To powinno być przyjęte rozwiązanie, ponieważ działa.
polym
2
Np. setw -g c0-change-trigger 10 setw -g c0-change-interval 250>> ~ / .tmux.conf
DmitrySandalov
2
Wypróbowałem je na tmux 2.3 i nie zostały rozpoznane. Staje się całkowicie bezużyteczny, gdy polecenia wyrzucają dużo danych wyjściowych.
ijt
1
Od wersji Tmux 2.1 opcje te nie istnieją zgodnie z raw.githubusercontent.com/tmux/tmux/2.6/CHANGES Opcje c0- * ograniczania prędkości zostały usunięte. Zamiast tego stosuje się podejście wycofywania.
megar
7

Zawsze możesz wydać kill-panepolecenie z poziomu sesji. Jeśli tekst terminala przypomina śmieci, zmiana nazwy okna i / lub wydanie resetpowinno to naprawić.

lukaszkorecki
źródło
4

Ponieważ tmuxwstawia się międzycat proces a terminalem, musi odczytać dane wyjściowe cat, zapisać je na terminalu, a jednocześnie odczytać dane wejściowe z terminala (^ C) i wysłać je do powłoki, aby przerwać dowództwo. Nie jestem pewien, co dokładnie powoduje opóźnienie, ale jest coś o tym, jak tmuxbuforuje we / wy między tobą a działającą powłoką tmux.

chepner
źródło
3

Zakładając, że używasz ssh przez połączenie o niskim opóźnieniu, czy próbowałeś używać mosh ? Wśród innych bardzo fajnych rzeczy, takich jak przewidywanie danych wejściowych, a także przetrwanie rozłączeń, a nawet zmiana adresu IP po stronie klienta, w szczególności poprawia on czas reakcji przy użyciu Ctrl-C (poprzez okresową aktualizację zawartości terminala zamiast wysyłania całego strumienia) .

Możesz używać tmuxwewnątrz moshbez żadnych problemów.

Julien Oster
źródło
O dziwo dzieje się tak, gdy pracuję lokalnie. mosh wygląda jednak całkiem schludnie.
Snowball
1

Miałem ten problem z tmux 2.3. Próbowałem ustawić opcje c0-interwał zmiany i c0-zmiana wyzwalacza, jak opisano powyżej, ale nie są one już dostępne. Oto zmiana git w nowym podejściu: https://github.com/tmux/tmux/commit/3f4ee98162cd5bb7000f93fec0e631e123b1281d

Powrót do tmux 1.8 naprawił problem bez konieczności ustawiania żadnych opcji.

ijt
źródło
Wygląda na to, że próbują to naprawić, zamiast używać obejścia, więc nowsze wersje powinny uzyskać jeszcze lepsze wyniki. github.com/tmux/tmux/issues/849
dragon788