Problema
Ejecuto un comando que genera MUCHA información a través de SSH. Por ejemplo, agrego tontamente información de depuración dentro de un bucle que se ejecuta millones de veces, o simplemente corro cat /dev/urandom
por patadas.
La terminal está inundada de información.
Quiero terminar el comando lo antes posible y arreglar mi programa. No me importa lo que imprima. Ahora, la cosa es que presiono Ctrl+ CASAP (en el ejemplo anterior lo presioné inmediatamente después de ejecutar el comando), pero aún así toma su tiempo imprimir toda la información que ni siquiera necesito .
Lo que he intentado
Intenté presionar Ctrl+ con Ctanta fuerza que tuvo resultados divertidos cuando la terminal finalmente se puso al día:
OUTPUT HERE^C
rr-@burza:~/xor$ ^C
rr-@burza:~/xor$ ^C
rr-@burza:~/xor$ ^C
^C^C
^C^C^C^C^C^C^C^C^C^C^C
^C^C^C^C^C^C^C^C^C^C
^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C
^C^C^C^C^C^C^C
^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C
^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C
^C^C^C^C^C^C^C^C^C^C^C^C^C
rr-@burza:~/xor$ ^C
rr-@burza:~/xor$ ^C
rr-@burza:~/xor$ ^C
rr-@burza:~/xor$ ^C
rr-@burza:~/xor$ ^C
rr-@burza:~/xor$ ^C
rr-@burza:~/xor$ ^C
rr-@burza:~/xor$ ^C
rr-@burza:~/xor$ ^C
También leí acerca de Ctrl+, Sque aparentemente se usa para decirle a la terminal "detener salida, necesito ponerme al día" pero aparentemente no hace nada.
Detalles varios
Me gustaría no alterar el comando que ejecuto para poder rescatarme en cualquier situación, incluso si no recuerdo que el programa que ejecuto podría terminar así.
Mi cliente SSH se ejecuta en Cygwin ( CYGWIN_NT-6.1-WOW64 luna 1.7.30(0.272/5/3) 2014-05-23 10:36 i686 Cygwin
) en MinTTY con el tipo de terminal establecido en xterm-256color
.
El servidor SSH se ejecuta en Debian ( Linux burza 3.2.0-4-686-pae #1 SMP Debian 3.2.51-1 i686 i686 i686 GNU/Linux
).
Ctrl-O
, lo que significa "descartar cualquier salida que se escriba en este terminal".-j
opción, para habilitar el desplazamiento de salto. El problema básico es que el control remoto puede enviar datos más rápido de lo que la ventana del terminal puede mostrar; de manera predeterminada, tiene que bitblt el contenido de la ventana cada vez que se imprime una nueva línea. Una gran cantidad de datos pueden almacenarse en el momento en que su Ctrl-C sea recibido por el sistema remoto, y su programa de terminal intentará mostrarlos..bashrc
?Respuestas:
Parte de esa salida se almacenará temporalmente. Envía su Ctrl+ Cal extremo remoto que interrumpe el programa en ejecución. El programa existe y el shell envía los caracteres para mostrarte el aviso nuevamente. Antes de que se muestre el mensaje, su pantalla mostrará primero todos los datos almacenados en el búfer y que ya están en camino.
Lo que está pidiendo es que el programa se detenga y los datos en tránsito desaparezcan de alguna manera. Eso no puede suceder ya que está en camino.
La única forma en que puede asegurarse de no ver estos datos es salir de la terminal en su extremo y luego volver a conectarse a su control remoto, pero eso probablemente sea mucho más esfuerzo que esperar a que se muestren los datos almacenados.
fuente
Por lo general, ejecuto el resultado
less
para poder matarlo a través deless
la qtecla.Ejemplo
Después de presionar q+ Enterse cerrará y volverá a su terminal normal, dejándolo limpio y agradable.
¿Por qué pasa eso?
El problema con el que se encuentra es que hay buffers (para STDOUT) que se están poniendo en cola con la salida de su pantalla. Estas memorias intermedias se llenan tan rápido que no puede interrumpirlo lo suficientemente rápido como para detenerlo.
Para deshabilitar / limitar este efecto, puede deshabilitar el almacenamiento intermedio STDOUT, lo que debería hacer que las cosas sean un poco más receptivas
stdbuf
, pero es probable que tenga que jugar con esta configuración para obtener las cosas de la manera que desee. Para quitar el buffer de STDOUT puedes usar este comando:La página de manual para
stdbuf
detalles de las opciones a su disposición:Para un buen fondo sobre cómo funciona el almacenamiento en búfer, le recomiendo que eche un vistazo a este Pixel Beat articulado titulado: almacenamiento en búfer en secuencias estándar . Incluso incluye buenas fotos.
Referencias
fuente
|less
acmd
que, lamentablemente, a menudo no lo hacen. Si ejecutacmd
, aún debe esperar hasta que termine de imprimir los resultados calculados antes de recibir^C
.Hay varios niveles de almacenamiento en búfer. Cuando presiona Ctrl+ C, esto impide que el programa emita datos al terminal. Esto no afecta los datos que el emulador de terminal aún no ha mostrado.
Cuando se muestran datos a muy alta velocidad, el terminal no puede mantener el ritmo y se retrasará. Eso es lo que está sucediendo aquí: mostrar texto es mucho más costoso que producir estos números aleatorios. Sí, incluso con una fuente de mapa de bits: producir números aleatorios de calidad criptográfica es muy barato en comparación. (Acabo de probar en mi máquina y el proceso X saturó la CPU, con
xterm
un pequeño porcentaje ycat
(que se tiene en cuenta en la generación de números aleatorios) apenas alcanza el 1%. Y eso con una fuente de mapa de bits).Si quiere que esto se detenga ahora, elimine el emulador de terminal. Si no desea hacer eso, al menos minimice la ventana; Los emuladores de terminal inteligentes (como xterm) no asignarán la ventana, lo que ahorra el tiempo de CPU X, por lo que la basura terminará de mostrarse más rápido. El servidor X tiene alta prioridad, por lo que esto hará una gran diferencia en la capacidad de respuesta de su máquina mientras xterm procesa los datos en segundo plano.
Cuando todo esto ocurre en un shell remoto, el retraso es aún peor, porque los datos producidos por
cat
primero tienen que pasar por la conexión SSH. Su presión de Ctrl+ Ctambién tiene que pasar por la conexión SSH; obtiene una prioridad algo mayor (se envía fuera de banda), pero eso todavía lleva algún tiempo durante el cual se acumula más salida. No hay forma de suprimir los datos en tránsito antes de cerrar la conexión SSH (lo que puede hacer presionando Enterluego~.
).fuente
Debería ser suficiente para encontrar un camino hacia
kill
elcat
comando.Para las siguientes propuestas, es posible que necesite una segunda conexión ssh abierta.
Raramente CTRL+zpuede ser más efectivo que CTRL+c: puede responder más rápido. Después de eso, suspende el comando con el que puede matarlo
kill %1
o lo que sea su número de trabajo.Esto con la esperanza de que aún pueda leer cualquier cosa de la pantalla (un texto binario aleatorio inundado puede arruinar fácilmente el conjunto de caracteres).
Como recuerda Gilles, si minimiza la ventana, probablemente el sistema leerá la solicitud de interrupción más rápido que usted para eliminar el proceso. Así que suspender / romper, minimizar, esperar un poco, maximizar de nuevo, también puede ser una solución.
Por supuesto, a través de una conexión ssh, espero que deba esperar un poco.
En otra terminal / sesión puede preguntar
pgrep cat
(si cat fue el comando invocado) e identificar que el proceso cat está usando más su CPU. Puede identificarlo con más precisión conpstree
:gato pgrep | awk '{print "pstree -sp" $ 1}' | sh | grep sshd
responder con una salida como
init (1) ───sshd (1062) ───sshd (22884) ───sshd (22951) ───bash (22957) ───cat (23131)
En este caso, después de que solo tengas que matar al PID del gato: kill 23131
Nota:
less
es más seguro.fuente
Tuve el mismo problema y no estaba satisfecho con las respuestas aquí, así que profundicé. Otros ya han mencionado que su comando está generando datos más rápido de lo que su ssh puede tomar, por lo que los almacenamientos intermedios de datos y los almacenamientos intermedios no se pueden detener.
Para solucionar esto, evite el almacenamiento en búfer acelerando la salida de sus comandos a la velocidad máxima que su sesión ssh puede tomar, ya existen comandos para hacer esto.
Configuración, primero descubra la velocidad máxima de sus sesiones:
Finalmente, estrangula tus comandos reales en consecuencia.
Ejemplo:
Es posible que desee reducir la TASA un poco en caso de que la velocidad de su conexión disminuya un poco de vez en cuando. Si cae, el comportamiento volverá a emitirse, un ctrl-c que no responde.
Alias de gato estrangulado opcional:
Ahora ctrl-c funciona como se esperaba, eliminando inmediatamente la salida ya que se almacena muy poco, si es que hay alguno.
fuente
cat
La salida rara vez es un problema, a diferencia de otro software. El autor solo lo usó como ejemplo. El problema generalmente se debe al otro software que puede no ser obvio si está dispuesto a producir muchos resultados. Usar cualquier tipo de comando prefijo o postfix no es una solución, ya que lleva tiempo escribirlo. No habrá ninguna ganancia en el resultado.Hay un software en Linux que resuelve exactamente este problema (algunas otras cosas también). También puede invocarlo desde un emulador de terminal en Windows (¿parece estar usando Windows?).
Prueba mosh , un reemplazo para el binario SSH. Funciona exactamente como SSH (puede hacerlo en
mosh user@hostname
lugar dessh user@hostname
y funcionaría exactamente como esperaba, incluso hará la autenticación de clave privada, etc.Básicamente ejecuta un proceso separado en el servidor que almacena los paquetes. Entonces, cuando presiona Ctrl + C en mosh, lo transmitirá al servidor remoto, que luego dejará de enviar la información adicional. Además, también predecirá el resultado de las pulsaciones de teclas, lo que le ahorrará un par de milisegundos cada vez que presione una tecla.
Desventaja: actualmente no es posible desplazarse hacia arriba en la historia mientras se usa mosh.
fuente