Armadilha de limpeza para o comando ssh em vários hosts remotos

6

Eu quero executar um comando arbitrário em vários hosts remotos usando o ssh. Esses comandos são na maioria comandos de execução longa que monitoram recursos do servidor e agregam a saída à estação de trabalho local (como tail -f , mpstat ou tcpdump / tcpflow com grep etc).

O problema é que eu não encontrei uma maneira que mantenha o comando em execução enquanto, mais tarde, terminasse de maneira confiável tanto a conexão SSH quanto o comando remoto para todos os hosts.

Eu tentei varias%% bandeira% variações, espera, gato, leitura, armadilhas etc ... Ambos são mortos instantaneamente, o terminal local fica preso ou o comando remoto continua em execução nos hosts remotos após a conexão ssh ser morto.

Isso é o que eu tenho no momento.

function server_ssh() {
  pids=""
  for box in 01 02 03; do
    ssh -t -t -f server$box "$1" &
    pids="$pids $!"
  done
  trap 'kill -9 $pids' SIGINT
  # wait, cat, read ??
}
    
por deephacks 07.10.2014 / 14:47

1 resposta

2

Parece algo para gnu paralelo . Tente algo assim:

function server_ssh() {
  parallel --line-buffer ssh server{} "$1" ::: 01 02 03
}
A opção

--line-buffer é necessária para permitir a combinação da saída dos diferentes comandos juntos (por padrão, agrupa a saída de cada comando juntos, portanto, é necessário aguardar até que cada um termine para ser exibido).

-u deve funcionar aqui também. Normalmente, ele pode permitir que partes de linhas sejam misturadas, mas como os comandos que você está usando provavelmente são baseados em linhas, isso não deveria acontecer.

Editar: --line-buffer está em teste alfa na versão que tenho (20130922-1), eu usaria -u .

    
por 07.10.2014 / 18:55

Tags