Dans une session tmux à l'intérieur de xterm, lorsque un programme génère beaucoup de sortie (comme un cat very_long_file
), toute la session est gelée pendant un certain temps. Même si j'appuie sur Ctrl-C, rien n'est interrompu. Apparemment, tmux est gelé et ne transmet pas le signal Ctrl-C au programme qui génère la sortie. Y a-t-il un moyen d'empêcher cela.
Réponses
Trop de publicités?Je rencontre toujours ce problème dans tmux 1.6-2 sur Ubuntu 12.10. Une solution de contournement que j'ai trouvée est de détacher de la session (préfixe+d) puis de se rattacher (tmux attach
, bon candidat pour un alias shell rapide). Il semble que tmux est effectivement réactif sous-jacent---vous pouvez confirmer que votre processus est réellement tué immédiatement avec ctrl-c---c'est juste le dessin qui bloque. La détache fonctionne immédiatement, et lorsque vous vous rattachez, le dessin aura sauté à la fin.
D'après ce que je sais, il n'y a pas moyen de l'empêcher dans les versions actuelles, mais certains travaux sont en cours. Vous pouvez trouver quelques correctifs sur la liste de diffusion de tmux http://thread.gmane.org/gmane.comp.terminal-emulators.tmux.user/2689.
Un bon mot-clé pour rechercher sur le web est "flow control".
La réponse https://superuser.com/a/589896/311481 fonctionne bien. J'utilise les valeurs suivantes :
setw -g c0-change-trigger 10
setw -g c0-change-interval 250
Autre conseil : si vous utilisez ssh dans tmux, utilisez mosh à la place : http://mosh.mit.edu/. Il se comporte de manière plus intelligente pour afficher la sortie des programmes. Il essaie d'afficher le dernier état de l'écran en supprimant les intermédiaires lorsque c'est approprié. Ainsi, tmux ne se bloquera jamais si beaucoup de sortie est générée dans ses fenêtres avec des sessions mosh à l'intérieur.
Contrairement à SSH, le protocole basé sur UDP de mosh gère la perte de paquets de manière élégante et ajuste le taux d'images en fonction des conditions du réseau. Mosh ne remplit pas les tampons réseau, donc Control-C fonctionne toujours pour arrêter un processus en fuite.
Étant donné que SSP [State Synchronization Protocol utilisé par mosh] fonctionne au niveau de l'objet et peut contrôler le taux de synchronisation (c'est-à-dire le taux d'images), il n'a pas besoin d'envoyer chaque octet reçu de l'application. Cela signifie que Mosh peut réguler les images pour ne pas remplir les tampons réseau, conservant la réactivité de la connexion et garantissant que Control-C fonctionne toujours rapidement. Les protocoles qui doivent envoyer chaque octet ne peuvent pas faire cela.
Malheureusement, les options c0-* pour le contrôle du débit ont été supprimées à partir de la version 2.1 de tmux (journal des modifications). Autant que je sache, la seule façon de personnaliser le contrôle du débit est de mettre à jour les variables qui influencent dans le code source (tmux.h):
"READ_SIZE est la taille maximale des données à conserver à partir d'un pty (le seuil haut de l'événement). READ_BACKOFF est la quantité de données en attente d'être sortie vers un tty avant que les lectures de pty soient ralenties. READ_TIME est la durée de la pause avant la lecture suivante (en microsecondes) si un tty est supérieur à READ_BACKOFF."
Où vous trouverez les valeurs par défaut: (à partir de tmux v2.2):
#define READ_SIZE 1024
#define READ_BACKOFF 512
#define READ_TIME 100
- Réponses précédentes
- Plus de réponses