web4you
Anmeldungsdatum: 27. Dezember 2008
Beiträge: Zähle...
|
Hi. Ich betreibe vier Server welche ich per ssh manage. Ich habe mir nun ein lokales script gebastelt, welches nacheinander an alle vier Server per ssh bestimmte Befehle sendet. Pro Server werden mehrere Befehle abgesetzt. Und so sieht as aus (nur zwei Server dargestellt) 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 | #!/bin/bash
echo " 118 Server "
ssh juerg@ip-server1 'storj --version'
ssh juerg@ip-server1 'netstat -an | grep -o "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}" | grep -v 192\.168 | grep -v 127\.0 | grep -v 0\.0 | sort -nr | uniq -c'
ssh juerg@ip-server1 'find /mnt/DriveShare/shards/ -type f -name *.ldb -printf "%T@\t%Tc %6k KiB %p\n" | sort | tail -n 10'
ssh juerg@ip-server1 'find /mnt/DriveShare/shards/ -type f -name *.ldb -printf "%T@\t%Tc %6k KiB %p\n" | wc -l'
ssh juerg@ip-server1 'sed "s/\s\+/+/g" <<<$(find /mnt/DriveShare/shards/sharddata.kfs/ -exec stat -c "%s" {} \;) | bc -l'
echo " "
echo " 105 Server "
ssh juerg@ip-105 'storj --version'
ssh juerg@ip-105 'netstat -an | grep -o "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}" | grep -v 192\.168 | grep -v 127\.0 | grep -v 0\.0 | sort -nr | uniq -c'
ssh juerg@ip-105 'find /mnt/DriveShare/shards/ -type f -name *.ldb -printf "%T@\t%Tc %6k KiB %p\n" | sort | tail -n 10'
ssh juerg@ip-105 'find /mnt/DriveShare/shards/ -type f -name *.ldb -printf "%T@\t%Tc %6k KiB %p\n" | wc -l'
ssh juerg@ip-105 'sed "s/\s\+/+/g" <<<$(find /mnt/DriveShare/shards/sharddata.kfs/ -exec stat -c "%s" {} \;) | bc -l'
echo " "
|
Da bestimmte Anfragen ziemlich lange dauern können, benötigt ein ganzer Durchlauf schon mal mehr als eine Minute. Mein Ziel wäre nun, die einzelnen Befehle gleichzeitig auszuführen. Ich habe dann jeweils ein "&" nach jedem Befehl gesetzt und am Ende ein "wait" eingefügt. Das klappt, jedoch werden die Ausgaben der einzelnen Befehle sofort nach beendetem Befehl ausgegeben. Sie sind also nicht mehr der Reihe nach. Gibt es dafür eine andere Lösung?
|
Vain
Anmeldungsdatum: 12. April 2008
Beiträge: 2510
|
Habe noch nicht ganz verstanden, ob du die Parallelität nun auf Serverebene oder auf Befehlsebene haben möchtest. Wenn es auf Befehlsebene sein soll, dann hast du das eigentlich schon richtig gemacht. Natürlich sind die Ausgaben dann aber nicht mehr sortiert. ☺ Auf Serverebene könntest du es gruppieren: | (
ssh juerg@server1 foo
ssh juerg@server1 bar
) &
(
ssh juerg@server2 foo
ssh juerg@server2 bar
) &
wait
|
(Wenn es jeweils exakt dieselben Befehle sind, die du an die Server absetzen möchtest, wäre über eine Schleife nachzudenken.) Hilft dir das weiter? Oder bin ich noch auf dem falschen Dampfer?
|
web4you
(Themenstarter)
Anmeldungsdatum: 27. Dezember 2008
Beiträge: Zähle...
|
Vain schrieb: Habe noch nicht ganz verstanden, ob du die Parallelität nun auf Serverebene oder auf Befehlsebene haben möchtest. Wenn es auf Befehlsebene sein soll, dann hast du das eigentlich schon richtig gemacht. Natürlich sind die Ausgaben dann aber nicht mehr sortiert. ☺ Auf Serverebene könntest du es gruppieren: | (
ssh juerg@server1 foo
ssh juerg@server1 bar
) &
(
ssh juerg@server2 foo
ssh juerg@server2 bar
) &
wait
|
(Wenn es jeweils exakt dieselben Befehle sind, die du an die Server absetzen möchtest, wäre über eine Schleife nachzudenken.) Hilft dir das weiter? Oder bin ich noch auf dem falschen Dampfer?
Danke. Das Problem sind eben genau die nicht sortierten Ausgaben, weil ich dann die Werte nicht zuordnen kann. Das mit dem Gruppieren werde ich noch testen. Ja und das mit der Schleife kommt sobald ich die gemounteten Partitionen alle auf den selben MountPoints habe.
|
web4you
(Themenstarter)
Anmeldungsdatum: 27. Dezember 2008
Beiträge: Zähle...
|
Also das mit den Gruppen funktioniert so wohl nicht. Er schmeisst mir die schnellsten Antworten sofort um die Ohren und das sind die Echos mit den Server Nummern/Namen. Danach kommen einfach der Ausfhrungszeit nach die Nächsten.
|
schusch
Anmeldungsdatum: 2. September 2008
Beiträge: 324
Wohnort: Berlin
|
Einfach die Ausgabe in eine Datei schreiben: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | (
ssh juerg@server1 foo
ssh juerg@server1 bar
) > OutServer1 &
(
ssh juerg@server2 foo
ssh juerg@server2 bar
) > OutServer2 &
wait
for out in OutServer?; do
wasauchimmer $out
done
|
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13205
|
Du kannst natürlich die Ausgaben pro Server in einer Datei auffangen und am Ende geordnet ausgeben. Dein Ansatz ist aber auch deshalb ineffizient, weil Du für jedes Kommando eine ssh startest. Das bedeutet immer wieder neuen Verbindungsaufbau, Authentifizierung und Schlüsselgenerierung. Viel besser ist es, wenn Du pro Server nur eine ssh startest, z.B. so: | ssh juerg@ip-server1 <<COMMANDS
storj --version
netstat -an | grep -o "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}" | grep -v 192\.168 | grep -v 127\.0 | grep -v 0\.0 | sort -nr | uniq -c
find /mnt/DriveShare/shards/ -type f -name *.ldb -printf "%T@\t%Tc %6k KiB %p\n" | sort | tail -n 10
find /mnt/DriveShare/shards/ -type f -name *.ldb -printf "%T@\t%Tc %6k KiB %p\n" | wc -l
sed "s/\s\+/+/g" <<<$(find /mnt/DriveShare/shards/sharddata.kfs/ -exec stat -c "%s" {} \;) | bc -l
COMMANDS
|
(ungetestet, kann sein, dass das Quoting da noch gefixt werden muss. Generell würde ich mir aber mal Ansible anschauen - das ist genau für solche Aufgaben gedacht. Du willst ja idealerweise auch das Skript trennen von den serverspezifischen Daten (Nutzer, Rechnernamen etc.), weil das viel leichter zu warten ist. Und noch etwas: wenn Du schon einen echten Punkt matchen willst, dann nimm doch fgrep statt grep und spar Dir das Escapen. Das letzte Kommando ist auch unnötig kompliziert. Das geht doch einfacher so: | find /mnt/DriveShare/shards/sharddata.kfs/ -exec stat -c "%s" {} + | sed "s/\s\+/+/g" | bc -l
|
|
web4you
(Themenstarter)
Anmeldungsdatum: 27. Dezember 2008
Beiträge: 60
|
@schusch Danke werde ich testen. @rklm Das mit den einzelnen Aufrufen hab ich schon angepasst. Danke. Dein Vorschlag betreffend der letzen Zeile funktioniert nicht. Ich brauche das Total aller Dateien. Dein Befehl listet einfach alle einzelnen Dateigrössen auf.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13205
|
web4you schrieb:
Dein Vorschlag betreffend der letzen Zeile funktioniert nicht. Ich brauche das Total aller Dateien. Dein Befehl listet einfach alle einzelnen Dateigrössen auf.
Achso, ich habe wohl nicht genau genug hingeschaut. Dann halt so: | find /mnt/DriveShare/shards/sharddata.kfs/ -printf %s\\n | paste -sd + | bc -l
|
Wenn es richtig viele Dateien sind, ist das hier vielleicht einen Tick effizienter: | { echo 0; find /mnt/DriveShare/shards/sharddata.kfs/ -printf %s+\\n; echo n; } | dc
|
Das ist allerdings pure Spekulation und ich zeige es nur, weil dc etwas mehr Aufmerksamkeit verdient. ☺
|
misterunknown
Ehemalige
Anmeldungsdatum: 28. Oktober 2009
Beiträge: 4403
Wohnort: Sachsen
|
Das ganze geht auch per ClusterSSH.
|
senden9
Anmeldungsdatum: 8. Februar 2010
Beiträge: 965
Wohnort: Österreich
|
rklm schrieb: […] Dein Ansatz ist aber auch deshalb ineffizient, weil Du für jedes Kommando eine ssh startest. Das bedeutet immer wieder neuen Verbindungsaufbau, Authentifizierung und Schlüsselgenerierung. […]
Mittels SSH multiplexing sollte man das Problem ebenfalls minimieren könne. Ich verwende auf meinen Hosts sowieso Multiplexing da ich so bei erneuten Verbindungsaufbau kein Delay spüre.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13205
|
senden9 schrieb: rklm schrieb: […] Dein Ansatz ist aber auch deshalb ineffizient, weil Du für jedes Kommando eine ssh startest. Das bedeutet immer wieder neuen Verbindungsaufbau, Authentifizierung und Schlüsselgenerierung. […]
Mittels SSH multiplexing sollte man das Problem ebenfalls minimieren könne. Ich verwende auf meinen Hosts sowieso Multiplexing da ich so bei erneuten Verbindungsaufbau kein Delay spüre.
Aber warum sollte man so etwas umständliches nutzen, wenn man nur eine fest definierte und am Anfang bekannte Sequenz von Kommandos auf dem entfernten System ausführen will? Ich kann den Sin erkennen, wenn man ein System administriert und sich immer mal wieder einloggen muss, insbesondere, wenn man mehrere parallele Verbindungen benötigt. Aber im vorliegenden Fall erscheint mir das eine unnötige Komplikation.
|
senden9
Anmeldungsdatum: 8. Februar 2010
Beiträge: 965
Wohnort: Österreich
|
Das war auch eher als Ergänzung und weniger als Ersatz zu deinem Vorschlag gedacht. Ich weiß ja nicht wie oft das Skript pro Zeiteinheit ausgeführt wird. Somit könnte man auch jede weiter Ausführung des Skriptes beschleunigen.
|