Como executar comandos de subshell por SSH?

0

Eu tenho um cluster de computadores que estão conectados via SSH sem senha e eu escrevi um utilitário que executa um comando sobre todo o cluster. A maneira como faz isso é pegar as máquinas presentes em um arquivo, passando por elas enquanto executa o comando especificado via SSH.

Agora eu quero executar um comando kill sobre o cluster. A maneira como faço isso é grep 'dos IDs do processo e, em seguida, execute o comando kill assim:

kill -9 $(ps -ef | grep service_name | awk '{print $2}')

Mas quando eu executo este comando, ele faz um loop em uma máquina, executa o comando, percorre a segunda máquina e simplesmente sai sem executar o comando. Então o comando finalmente acaba executando em apenas uma máquina.

Eu li sobre isso um pouco e descobri que os comandos de subshell cmd1 $(cmd2) executados no SSH não são executados corretamente.

Alguém pode me fornecer uma solução alternativa.

    
por Punit Naik 18.04.2016 / 09:07

4 respostas

-2

Eu coloquei o comando kill -9 $(ps -ef | awk "/service_name/{print \}") com um caractere '' 'e o executei usando meu utilitário e funcionou como um encanto. Então, abaixo está o comando final:

'kill -9 $(ps -ef | awk "/service_name/{print \}")'
    
por 18.04.2016 / 12:07
6

Na verdade, a substituição de comandos, que não é apenas uma sub-rede, funciona bem. Seu problema é que você quer que ele seja executado no sistema remoto pelo shell remoto, porque os processos que você quer matar são processos no sistema remoto. Então você tem que citar, o que fica um pouco desajeitado, embora você possa descartar o grep quando tiver awk . Duas opções são:

ssh user@remote "kill -9 \$(ps -ef | awk '/service_name/{print $2}')"
ssh user@remote 'kill -9 $(ps -ef | awk "/service_name/{print \}")'

No entanto, uma solução melhor para esse problema na maioria dos Linuxes e alguns (?) outros Unixes é pkill , que faz todo o trabalho de procurar por processos executando um comando em particular e matá-los:

ssh user@remote pkill -9 service_name

Dependendo de como o processo é iniciado, talvez seja necessário procurar na linha de comando completa:

ssh user@remote pkill -f -9 service_name
    
por 18.04.2016 / 09:51
4

Não farás pipp no awk!

ps -ef | awk '/service_name/ { print $2}' | xargs kill -9

ou

pkill service_name
    
por 18.04.2016 / 09:36
1

Tente:

ps -ef | grep service_name | awk '{print $2}' | xargs kill -9

Você pode querer testá-lo primeiro.

    
por 18.04.2016 / 09:12