Why “jobs -p | kill -n 15 ”não funciona?

1

Sou muito novo no Linux. E, de fato, eu uso o Cygwin agora e não o próprio Linux.

Estou tentando instalar o RVM (Ruby Version Manager).

Eu estava fazendo o comando rm -r ./.rvm -i . Eu queria remover a pasta .rvm e ver como me pediram para excluir ou não um arquivo / diretório. Eu vi alguns e parei com Ctrl+Z e, em seguida, removi a pasta .rvm inteira com o Windows Explorer, apenas enviei para a lixeira.

Mas quando eu queria sair do terminal com o comando exit , recebi uma mensagem dizendo que eu tinha parado os trabalhos:

$ jobs
[1]+  Stopped                 rm -r ./.rvm -i

Aqui eu li como matar o trabalho parado:

kill 'jobs -p'

Mas decidi experimentá-lo com sintaxe de comando pipe que li sobre aqui :

The output of each command in the pipeline is connected via a pipe to the input of the next command

Então eu fiz essas tentativas, mas não consegui o resultado desejado:

$ jobs -p | kill
$ jobs -p | kill -n 15 # 15 is SIGTERM signal
$ jobs -p | kill -n=15 # got error wrong signal spec
$ jobs -p | kill -s SIGTERM

E eu não entendo porque isso não funciona. jobs -p lista os IDs do processo:

$ jobs -p
340

Para que 340 ID tenha que ir para o comando kill -n 15 e deve matar o trabalho. Mas isso não acontece. Por quê? É possível usar pipe nesse caso?

    
por Green 14.03.2013 / 14:40

4 respostas

3
  • Os comandos têm vários fluxos padrão: Standard Out (stdout), Standard In (stdin) e Standard Error (stderr).
  • Pipes enviam o stdout de um comando para o stdin de outro comando
  • Kill recebe seus parâmetros por meio de sua lista de argumentos, e não dos fluxos "padrão"
  • Alguns comandos permitem que você especifique "-" no argumento para aceitar entrada de stdin como argumentos (não o comando kill )
  • Se você quiser canalizar stdout para a lista de argumentos de outra pessoa, use xargs , mas é preciso ter cuidado quando houver espaços em potencial-- e às vezes em outros casos ).

No seu caso, jobs -p não devem ter problemas com xargs e você pode usar o seguinte:

jobs -p | xargs kill

Se você gosta, você também pode ver os comandos exatos que ele executa usando --verbose (ou -t)

jobs -p | xargs --verbose kill
jobs -p | xargs -t kill

xargs é uma ferramenta poderosa. Tenha muito cuidado ao passar a entrada para ele ( find -print0 , grep -Z e xargs -0 se dão bem quando se trabalha com arquivos). Vale a pena o esforço para utilizá-lo (e, às vezes, economizar tempo).

    
por 14.03.2013 / 15:29
3

kill não aceita argumentos da entrada padrão, que é onde eles aparecerão se você os enviar como fez. A única maneira de usar kill é especificar um PID, ou uma lista de PIDs, como argumentos de linha de comando.

    
por 14.03.2013 / 14:45
0

Se SIGTERM (-15) não funcionar, tente SIGKILL (-9). Recomenda-se tentar primeiro o SIGTERM.

 kill 'jobs -p'
 kill -9 'jobs -p'
    
por 14.03.2013 / 14:49
0

Neste caso, você pode simplesmente digitar: fg, depois apertar ctrl-C.

Caso você queira matar diretamente o processo restante, abaixo do bash, você pode facilmente emitir um:

kill %1

Que eliminará o primeiro processo em segundo plano, conforme identificado pelos trabalhos.

    
por 24.03.2015 / 14:40