¿Cómo matar a un gato fugitivo?


128

Muchas veces accidentalmente ejecuto el catcomando en archivos que tienen contenidos de hasta miles de líneas.

Intento matar el catcomando con Ctrl+ Co Ctrl+ Z, pero ambos solo surten efecto después de que catse muestra la salida total de en el terminal, por lo que tengo que esperar hasta que catse ejecute por completo.

¿Existe una mejor solución que evite esperar? Porque a veces los archivos tienen un tamaño de hasta 100 MB, y se vuelve irritante esperarlo.

Estoy usando tcsh.


14
Usar comandos como more, less, tail, head puede ser una alternativa interesante a cat. (por supuesto, esto no es una respuesta ...)
tonioc

25
Ese fue el mejor título de preguntas que he leído. Hasta que vi que el enlace de la pregunta era para UL, pensé que necesitabas ayuda para matar a un felino fugitivo.
Lenz

55
Hace doble respuesta en la pregunta de la barra lateral desde otro sitio de SE Está muy aliviado de ver el logotipo "UL" al lado de la pregunta . No importa, continúa. (por lo general, es Arquade el que tiene los títulos de las preguntas con un aspecto muy fuera de contexto)
LindaJeanne

12
curiosity
Probaría

44
alias curiosity='sudo killall cat'
cas

Respuestas:


76

Si el (los) archivo (s) en cuestión contienen muchos datos, el envío de la señal puede llegar catantes de que finalice. Lo que realmente observa es la velocidad finita de su terminal: catenvía los datos al terminal y el terminal tarda un tiempo en mostrarlos todos.

Recuerde que, por lo general, tiene que volver a dibujar la ventana de salida completa para cada línea de salida (es decir, mover el contenido de la ventana una línea hacia arriba e imprimir la siguiente línea en la parte inferior). Si bien existen técnicas y algoritmos para hacer esto más rápido que si se hiciera de manera directa, todavía lleva algo de tiempo.

Por lo tanto, si desea deshacerse de la salida lo más rápido posible, oculte la ventana de terminal , ya que generalmente no se realiza un redibujo real. En un entorno gráfico, esto puede significar minimizar la ventana o cambiar a un escritorio virtual diferente, en la consola virtual de Linux simplemente cambie a otro (( Ctrl+) Alt+ ).Fx

También tenga en cuenta que si ejecuta esto a través de un enlace de red lento (SSH a través de una conexión GSM, por ejemplo), definitivamente vería una salida mucho menor antes catde que la señal lo matara, porque la velocidad del terminal ya no sería el cuello de botella. .


66
Si está esperando que los datos desciendan por una tubería SSH lenta, puede usar la secuencia de escape OpenSSH para cerrar la conexión. En una nueva línea, escriba ~?para ver las opciones disponibles (se ~.cierra).
RJHunter

11
También intenta detener la salida con Ctrl + S que envía tty-stop-output. Luego puede enviar Ctrl + C. Para reanudar la salida, presione Ctrl + Q ...
Martin Tournoij

1
@Carpetsmoker Probó eso, no detuvo el flujo de texto para mí en Ubuntu 14.04 + terminator + zsh.
Muru

@muru Gracias. Traté de probarlo, pero no pude reproducir el problema (parece que mi sistema es demasiado rápido, o tal vez no lo intenté lo suficiente).
Martin Tournoij

44
@Carpetsmoker Me temo que el control de flujo de software (que es Ctrl + S) no ayudará mucho en este caso (de un enlace de terminal rápido): los datos ya están en el búfer de terminal y esperando que el terminal lo procese. Por lo tanto, Ctrl + S le indicará a la aplicación que deje de enviar más datos, pero lo que ya se envió aún tendrá que mostrarse.
Peter

4

Configuración de terminal

Creo que esto tiene más que ver con la forma en que se configura el terminal, que con cualquier problema de almacenamiento en búfer. Verifique la salida de stty -a | grep intr, debe tener intr = ^C;en la línea de salida si Ctrl- Cestá habilitado en tty/ pty. Si no es así, puede usarlo stty intr ^Cpara habilitarlo. Agregue la línea a su .tcshrco .loginpara que sea permanente (¡o elimine la línea que la cambia en primer lugar!).

El no Ctrl- C, también puede intentar el envío SIGQUITcon Ctrl- \. Si esto no funciona, vuelva a verificar stty -a | grep quitsi está configurado correctamente.

Configuración del emulador de terminal

También verifique la configuración de su emulador de terminal (si está usando uno), puede ser que haya un acceso directo configurado en este nivel (tal vez para copiar o algo) y el Ctrl- Cno alcanza el ptynivel. También se puede configurar un acceso directo en otro lugar de su entorno de escritorio o sistema de Windows.

Una buena prueba en Linux si está utilizando un emulador de terminal es cambiar a una consola Linux ( Ctrl- Alt- F1), iniciar sesión allí y ver si ocurre el mismo comportamiento. Si no es así, esto sugiere que el problema radica en su sistema de Windows o emulador de terminal.

Podría ser un problema con el retraso entre los datos que se leen desde el ptydispositivo como lo sugiere peterph . Pero si este es el caso y usted realmente tiene que esperar minutos para que se muestren los datos, entonces seguramente el emulador de terminal es de amortiguación manera demasiados datos (o su PC es muy lento). La respuesta sería encontrar una manera de reducir ese tamaño de búfer en la configuración del emulador de terminal o usar una diferente.

Consejo extra

Algo más que vale la pena agregar; Por lo general, termino en la catsituación fuera de control cuando accidentalmente catun archivo binario. El otro efecto de esto puede ser arruinar la configuración de su terminal (si los datos binarios coinciden con varios códigos de escape de terminal, lo que a menudo sucede). Si tputestá instalado (generalmente es por defecto), puede evitar tener que reiniciar con el siguiente comando:

tput reset

3

Esta es la tmuxopción c0-change-intervaly está c0-change-triggerdiseñado para. De todos modos, debe usar un administrador de pantalla para la sesión reanudable.


1

La opción Ctrl- Oha estado en Unix desde los 110 días en baudios. Los comandos de gato fuera de control siempre fueron un problema cuando se volcó un archivo ASCII largo en el dispositivo de salida lenta y se colocó todo el archivo en el búfer de salida del controlador del dispositivo. Ctrl- Oiniciaría la descarga del búfer y un seguimiento Ctrl- Odesactivaría la descarga para que el gato pudiera leerse a la velocidad normal. Ctrl- Ose ingresó y todo el archivo se enjuagaría y devolvería rápidamente un símbolo del sistema.

Se desconoce si los codificadores de controladores de dispositivos Linux sintieron o no la necesidad de continuar agregando esta característica. Esta característica se agregó en el nivel del controlador del dispositivo donde Ctrl- Sy Ctrl- Qsolo se pudo implementar. Usé esto para volcar grandes ejecuciones de depuración con mucha impresión de cheques y luego desplazarme hacia el lugar que necesitaba ver.


Ctrl-O no parece implementarse en Linux modernos, al menos no en el servidor RHEL o Ubuntu.
dotancohen

-1

Al usar bash, puede suspender el trabajo usando Ctrl+ Zy luego matarlo, ya sea usando el PID o siguiendo las respuestas de https://stackoverflow.com/questions/1624691/linux-kill-background-task (por ejemplo, kill -9 %%)


3
pero estoy usando tcshy Ctrl + Z no funciona ... ya lo dije en cuestión.
JigarGandhi

sí, lo siento, no leí en tu publicación que intentaste Ctrl + Z y supuse erróneamente que Ctrl + Z es manejado por el shell en contraste con Ctrl + C que es manejado por la aplicación. Es por eso que pensé que Ctrl + Z funcionaba instantáneamente mientras que Ctrl + C no.
Jannis

-1

abra una nueva consola, por ejemplo, haciendo clic en el icono de la consola o presionando Ctrl+ Alt+ F2. Ahí entra

killall -9 cat

y cat será asesinado a menos que tenga un bloqueo NFS rancio o una situación de "suspensión ininterrumpida" (lea en un sector defectuoso sin tiempo de espera establecido).


10
El problema no es con cat, se trata de lo que se catha escrito en el terminal antes de morir y aún no se ha leído ni procesado ni mostrado por el emulador de terminal (y está sentado en un búfer (alrededor de 64 kB en Linux) dentro del controlador pty) .
Stéphane Chazelas

A continuación, intente echo 3> / proc / sys / vm / drop_caches, que también eliminará muchos búferes.
Thorsten Staerk

77
No, eso solo dejaría caer datos en caché, nunca cosas así, ya que eso afectaría la funcionalidad
Stéphane Chazelas

44
@ThorstenStaerk drop_cachescontrola las páginas utilizadas como caché por el kernel (generalmente para un sistema de archivos), no los búferes internos de terminales, controladores de red y demás; si lo hiciera, tendría consecuencias muy graves, como señaló Stéphane (básicamente perderías datos) .
Peter

1
¿No killall -9 catmataría también a otras instancias de gato que aún podrían estar haciendo cosas buenas en otros hilos de proceso?
Joe

-7

Puedes probar con esto

Restablecer el uso de la pantalla -ctrlj

Si cat todavía se está ejecutando, abra una nueva terminal y ejecute este pkill -9 -f cat"Esto eliminará todos los procesos de cat".


Ctrl + J no funciona
JigarGandhi

26
pkill con 'cat-f' es muy peligroso, ya que el -f buscará patrón de 'gato' en las líneas de comando conjunto, que es probable que ocurra, y hacer que los resultados no deseados ...
tonioc

2
Por ejemplo, pkill -f caten mi escritorio mataría el área de la bandeja del sistema de la barra de tareas de Xfce4.
Mark
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.