Como matar um gato fugitivo?

128

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

Eu tento matar o catcomando com Ctrl+ Cou Ctrl+ Z, mas ambos só entram em vigor após a saída total de catser exibida no terminal, então tenho que esperar até que catseja completamente executado.

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

Eu estou usando tcsh.

JigarGandhi
fonte
14
Usar comandos como mais, menos, cauda, ​​cabeça pode ser uma alternativa interessante ao gato. (é claro que isso não é uma resposta ...)
tonioc
25
Esse foi o maior título de pergunta que eu já li. Até que vi que o link da pergunta era para a UL, achei que você precisava de ajuda para matar um felino fugitivo.
Lenz
5
A pergunta da barra lateral de outro site do SE ficou muito aliviada ao ver o logotipo "UL" ao lado da pergunta . Deixa pra lá, continue. (geralmente, é o Arquade que tem os títulos de perguntas
aparentemente
12
Gostaria de tentar o curiositycomando ...
Sekhemty
4
alias curiosity='sudo killall cat'
cas

Respostas:

76

Se o (s) arquivo (s) em questão contiver realmente muitos dados que o envio do sinal pode realmente chegar catantes de terminar. O que você realmente observa é a velocidade finita do seu terminal - catenvia os dados para o terminal e leva algum tempo para o terminal exibir tudo.

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 tivesse sido feito da maneira direta, ainda leva algum tempo.

Portanto, se você deseja se livrar da saída o mais rápido possível, oculte a janela do terminal , pois normalmente não ocorre um redesenho real. No ambiente gráfico, isso pode significar minimizar a janela ou alternar para um desktop virtual diferente; no console virtual do Linux, basta alternar para outro (( Ctrl+) Alt+ ).Fx

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

peterph
fonte
6
Se você estiver aguardando os dados descerem por um canal SSH lento, poderá usar a sequência de escape do OpenSSH para fechar a conexão. Em uma nova linha, digite ~?para ver as opções disponíveis ( ~.fecha).
RJHunter
11
Você também tenta parar a saída com Ctrl + S que é enviado tty-stop-output. Você pode então enviar Ctrl + C. Para retomar a saída, pressione Ctrl + Q ...
Martin Tournoij
1
@Carpetsmoker Testou isso, não parou o fluxo de texto para mim no Ubuntu 14.04 + terminator + zsh.
Muru
@muru Obrigado. Tentei testá-lo, mas não consegui reproduzir o problema (meu sistema é muito rápido, ao que parece, ou talvez eu não tenha me esforçado o suficiente).
Martin Tournoij
4
@Carpetsmoker Acho que o controle de fluxo de software (que é Ctrl + S) não ajudará muito nesse caso (de um link rápido do terminal) - os dados já estão no buffer do terminal e aguardam o processamento do terminal. Portanto, Ctrl + S diz ao aplicativo para parar de enviar mais dados, mas o que já foi enviado ainda precisará ser exibido.
Peterph
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 buffer. Verifique a saída de stty -a | grep intr, você deve ter intr = ^C;na linha de saída se Ctrl- Cestiver ativado no tty/ pty. Caso contrário, você pode stty intr ^Chabilitá-lo. Adicione a linha ao seu .tcshrcou .loginpara torná-lo permanente (ou exclua a linha que a altera em primeiro lugar!).

Se falhar Ctrl- C, você também pode tentar enviar SIGQUITcom Ctrl- \. Se isso não funcionar, verifique novamente stty -a | grep quitse está configurado corretamente.

Configuração do emulador de terminal

Verifique também as configurações do seu emulador de terminal (se você estiver usando um), pode ser que haja um atalho configurado nesse nível (talvez para cópia ou algo assim) e o Ctrl- Cnão atinja o ptynível. 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 é alternar para um console Linux ( Ctrl- Alt- F1), faça o login lá e veja se o mesmo comportamento ocorre. Caso contrário, isso sugere que o problema está no seu sistema Windows ou emulador de terminal.

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

Dica Extra

Algo mais que vale a pena acrescentar; Normalmente, acabo na catsituação de fuga quando, acidentalmente, catum arquivo binário. O outro efeito disso pode ser alterar as configurações do terminal (se os dados binários coincidirem com vários códigos de escape do terminal, o que geralmente ocorre). Se tputestiver instalado (normalmente é por padrão), você pode evitar ter que reiniciar com o seguinte comando:

tput reset
Graeme
fonte
3

É para isso que tmuxopção c0-change-intervale c0-change-triggerprojetada. Você deve usar um gerenciador de tela para uma sessão recuperável de qualquer maneira.

J-16 SDiZ
fonte
1

A opção Ctrl- Oestá no Unix desde os 110 dias de transmissão. Os comandos fugitivos do gato sempre foram um problema quando um arquivo ASCII longo era despejado no dispositivo de saída lento e o arquivo inteiro era colocado no buffer de saída do driver de dispositivo. Ctrl- Oiniciaria a descarga do buffer e um acompanhamento Ctrl- Oalternaria a descarga para que o gato pudesse ser lido na velocidade normal. Ctrl- Ofoi inserido e o arquivo inteiro descarregou e retornou rapidamente um prompt de comando.

Ainda não se sabe se os codificadores do driver de dispositivo Linux sentiram a necessidade de continuar adicionando esse recurso. Esse recurso foi adicionado no nível do driver de dispositivo, onde Ctrl- Se Ctrl- Qsó podiam ser implementados. Usei isso para despejar grandes execuções de depuração com muitas impressões de cheques e, em seguida, role para baixo até o local que eu precisava ver.

user62612
fonte
O Ctrl-O não parece ser implementado nos Linux modernos, pelo menos não no servidor RHEL ou Ubuntu.
dotancohen
-1

Ao usar o bash, você pode suspender o trabalho usando Ctrl+ Ze depois matá-lo, usando o PID ou seguindo as respostas de https://stackoverflow.com/questions/1624691/linux-kill-background-task (por exemplo, kill -9 %%)

Jannis
fonte
3
mas eu estou usando tcshe Ctrl + Z não está funcionando ... já afirmou isso em questão.
precisa saber é o seguinte
sim, desculpe, não li na sua postagem que você tentou Ctrl + Z e eu assumi erroneamente que Ctrl + Z é tratado pelo shell em contraste com Ctrl + C, que é tratado pelo aplicativo. Por isso, pensei que Ctrl + Z funcionou instantaneamente enquanto Ctrl + C não.
Jannis
-1

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

killall -9 cat

e o gato será morto, a menos que você tenha um bloqueio NFS antigo ou uma situação de "suspensão ininterrupta" (leia em um setor incorreto sem tempo limite definido).

Thorsten Staerk
fonte
10
O problema não é: trata cat-se do que catfoi gravado no terminal antes de morrer e ainda não foi lido, processado ou exibido pelo emulador de terminal (e está instalado em um buffer (cerca de 64kB de tamanho grande no Linux) dentro do driver pty) .
Stéphane Chazelas
Então tente echo 3> / proc / sys / vm / drop_caches, que também eliminará muitos buffers.
Thorsten Staerk
7
Não, isso só eliminaria dados em cache, nunca coisas assim, pois isso afetaria a funcionalidade!
Stéphane Chazelas
4
O @ThorstenStaerk drop_cachescontrola as páginas usadas como cache pelo kernel (geralmente para um sistema de arquivos), não os buffers internos de terminais, drivers de rede e outros - se o fizesse, teria conseqüências bastante graves, como Stéphane apontou (basicamente você perderia dados) .
Peterph
1
O killall -9 cattambém não mataria outras instâncias de gato que ainda possam estar fazendo coisas boas em outros threads de processo?
Joe
-7

Você pode tentar com isso

Redefinir o uso da tela -ctrlj

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

vembutech
fonte
Ctrl + J não funciona
JigarGandhi
26
pkill com 'gato -f' é muito perigoso, já que o -f vai olhar para o padrão 'gato' em linhas de comando inteiras, o que é provável de ocorrer, e causar resultados indesejados ...
tonioc
2
Por exemplo, pkill -f catna minha área de trabalho, a área da bandeja do sistema da barra de tarefas do Xfce4 mataria.
Mark