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

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

Quero executar um comando arbitrário em vários hosts remotos usando ssh. Esses comandos são , em sua maioria, comandos de longa execução que monitoram os recursos do servidor e agregam a saída à minha estação de trabalho local (como tail -fou mpstat/ com etc).tcpdumptcpflowgrep

O problema é que não encontrei uma maneira de manter o comando em execução e, posteriormente, encerrar de forma confiável a conexão SSH e o comando remoto para todos os hosts.

Eu tentei muitas sshvariações de sinalizadores, wait, cat, read, traps etc ... Ambos são eliminados instantaneamente, o terminal local fica preso ou o comando remoto continua sendo executado nos hosts remotos após a conexão ssh ser encerrada.

Isso é o que 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 ??
}

Responder1

Parece algo paraparalelo gnu. Tente algo assim:

function server_ssh() {
  parallel --line-buffer ssh server{} "$1" ::: 01 02 03
}

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

-udeve funcionar aqui também. Normalmente, isso poderia permitir que partes de linhas se misturassem, mas como os comandos que você está usando provavelmente são baseados em linhas, isso não deveria acontecer.

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

informação relacionada