Como matar um gato fugitivo?

126

Muitas vezes, eu acidentalmente executo o comando cat em arquivos com conteúdo de até alguns milhares de linhas.

Eu tento matar o comando cat com Ctrl + C ou Ctrl + Z , mas ambos só entram em vigor após a saída total de cat ser exibida no terminal, então eu tenho que esperar até que cat seja completamente executado.

Existe uma solução melhor que evite esperar? Porque às vezes os arquivos são do tamanho de 100MB, e fica irritante esperar por isso.

Estou usando tcsh .

    
por JigarGandhi 01.01.2015 / 10:37

7 respostas

75

Se o (s) arquivo (s) em questão contiver muitos dados enviando o sinal, pode chegar a cat antes de terminar. O que você realmente observa é a velocidade finita de seu terminal - cat envia os dados para o terminal e leva algum tempo para o terminal exibir todos eles.

Lembre-se de que geralmente é necessário redesenhar toda a janela de saída para cada linha de saída (ou seja, mover o conteúdo da janela uma linha para cima e imprimir a próxima linha na parte inferior). Embora existam técnicas e algoritmos para tornar isso mais rápido do que se fosse feito de maneira simples, ainda leva algum tempo.

Assim, se você quiser se livrar da saída o mais rápido possível, oculte a janela do terminal , porque geralmente não há redesenho real. Em ambiente gráfico isso pode significar tanto minimizar a janela quanto mudar para uma área de trabalho virtual diferente, no console virtual Linux apenas mudar para outra (( Ctrl +) Alt + < kbd> F x ).

Observe também que, se você executou isso em um link de rede lento (SSH através de uma conexão GSM, por exemplo), você definitivamente veria muito menos saída antes que cat fosse morto pelo sinal, porque a velocidade do terminal não seria Não seja mais o gargalo.

    
por 01.01.2015 / 11:45
4

Configuração do terminal

Eu acho que isso tem mais a ver com a maneira como o terminal é configurado, do que com qualquer problema de buffering. Verifique a saída de stty -a | grep intr , você deve ter intr = ^C; na linha de saída se Ctrl - C estiver habilitado no tty / pty . Se não for, você pode usar stty intr ^C para ativá-lo. Adicione a linha ao seu .tcshrc ou .login para torná-la permanente (ou exclua a linha que a altera em primeiro lugar!).

Ao falhar Ctrl - C , você também pode tentar enviar SIGQUIT com Ctrl - \ . Se isso não funcionar, verifique novamente stty -a | grep quit para ver se está configurado corretamente.

Configuração do emulador de terminal

Verifique também as configurações do emulador de terminal (se você estiver usando um), pode ser que haja um atalho configurado neste nível (talvez para cópia ou algo assim) e a Ctrl - C não alcança o nível pty . Um atalho também pode ser configurado em outro lugar no ambiente de área de trabalho ou no sistema Windows.

Um bom teste no Linux, se você estiver usando um emulador de terminal, é mudar para um console Linux ( Ctrl - Alt - F1 ) , faça o login e veja se o mesmo comportamento ocorre. Se isso não acontecer, isso sugere que o problema está no sistema do Windows ou no emulador de terminal.

Pode haver um problema com o atraso entre os dados sendo lidos do dispositivo pty , conforme sugerido por peterph . Mas se este é o caso e você realmente tem que esperar minutos para os dados serem exibidos, então certamente o emulador de terminal está armazenando em buffer way muitos dados (ou seu PC está muito lento). A resposta seria encontrar uma maneira de reduzir esse tamanho de buffer nas configurações do emulador de terminal ou usar um diferente.

Dica Extra

Outra coisa que vale a pena adicionar; Eu geralmente acabo na situação cat fugitiva quando se eu acidentalmente cat um arquivo binário. O outro efeito disso pode ser estragar suas configurações de terminal (se os dados binários coincidirem com vários códigos de escape de terminal, o que geralmente acontece). Se tput estiver instalado (geralmente é por padrão), você pode evitar ter que reiniciar com o seguinte comando:

tput reset
    
por 02.01.2015 / 09:50
3

É para isso que tmux option c0-change-interval e c0-change-trigger foram criados. Você deve usar um gerenciador de tela para a sessão retomável de qualquer maneira.

    
por 04.01.2015 / 11:18
1

A opção Ctrl - O está no Unix desde os 110 dias de baud. Os comandos cat catástrofe sempre foram um problema quando um arquivo ASCII longo foi despejado no dispositivo de saída lenta e o arquivo inteiro colocado no buffer de saída do driver de dispositivo. Ctrl - O iniciaria o esvaziamento do buffer e uma continuação Ctrl - O desabilitaria o flush para que o gato pudesse ser lido na velocidade normal. Ctrl - O foi inserido e o arquivo inteiro seria liberado e retornaria rapidamente um prompt de comando.

Se os codificadores de drivers de dispositivos Linux sentem ou não a necessidade de continuar a adicionar esse recurso é desconhecido. Este recurso foi adicionado ao nível do driver de dispositivo onde Ctrl - S e Ctrl - Q só pode ser implementado. Eu usei isso para despejar grandes execuções de depuração com muita impressão de cheque e, em seguida, role até o lugar que eu precisava ver.

    
por 07.01.2015 / 21:41
-1

Ao usar o bash, você pode suspender o trabalho usando Ctrl + Z e depois matá-lo, usando o PID ou seguindo as respostas de link (por exemplo, kill -9 %%)

    
por 01.01.2015 / 14:51
-1

abra um novo console, por exemplo, clicando no ícone do console ou pressionando Ctrl + Alt + F2 . Lá, digite

killall -9 cat

e cat serão eliminados, a menos que você tenha um bloqueio de NFS obsoleto ou uma situação de "ininterrupção de sono" (leia em um setor defeituoso sem tempo limite definido).

    
por 01.01.2015 / 20:02
-7

Você pode tentar com isso

Redefina a exibição use ctrl - j

Se o gato ainda estiver rodando, abra um novo terminal e execute este pkill -9 -f cat "Isso matará todos os processos do gato."

    
por 01.01.2015 / 10:54