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 -f
ou mpstat
/ com etc).tcpdump
tcpflow
grep
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 ssh
variaçõ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-buffer
A 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).
-u
deve 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-buffer
está em teste alfa na versão que tenho (20130922-1), eu usaria -u
.