Cleanup-Trap für SSH-Befehl auf mehreren Remote-Hosts

Cleanup-Trap für SSH-Befehl auf mehreren Remote-Hosts

Ich möchte einen beliebigen Befehl auf mehreren Remote-Hosts mit SSH ausführen. Bei diesen Befehlen handelt es sich meist um lang andauernde Befehle, die Serverressourcen überwachen und die Ausgabe auf meiner lokalen Arbeitsstation aggregieren (wie tail -f, mpstatoder tcpdump/ tcpflowmit grepusw.).

Das Problem besteht darin, dass ich keine Möglichkeit gefunden habe, den Befehl weiter auszuführen und gleichzeitig später sowohl die SSH-Verbindung als auch den Remote-Befehl für alle Hosts zuverlässig zu beenden.

Ich habe viele sshFlag-Variationen ausprobiert, wait, cat, read, traps usw. ... Entweder werden beide sofort beendet, das lokale Terminal bleibt hängen oder der Remote-Befehl wird auf den Remote-Hosts weiter ausgeführt, nachdem die SSH-Verbindung beendet wurde.

Das ist, was ich im Moment habe.

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 ??
}

Antwort1

Sieht aus wie etwas fürgnu parallel. Versuchen Sie es mit etwas wie diesem:

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

--line-bufferDie Option ist erforderlich, um das Mischen der Ausgabe der verschiedenen Befehle zu ermöglichen (standardmäßig wird die Ausgabe aller Befehle gruppiert, daher muss mit der Anzeige gewartet werden, bis die einzelnen Befehle fertig sind).

-usollte hier auch funktionieren. Normalerweise könnte es dazu kommen, dass Teile von Zeilen durcheinander geraten, aber da die von Ihnen verwendeten Befehle wahrscheinlich zeilenbasiert sind, sollte das nicht passieren.

Bearbeiten: --line-bufferbefindet sich in der Alpha-Testphase in der Version, die ich habe (20130922-1), ich würde es nehmen -u.

verwandte Informationen