Hi,
mal zum verstandnis, warum geht:
aber nicht:Code:BLA=`ssh root@server date` echo $BLA
und wie kann ich das Problem lösen?Code:BLA=`ssh root@server date` & echo $BLA
thx,
tom
Hi,
mal zum verstandnis, warum geht:
aber nicht:Code:BLA=`ssh root@server date` echo $BLA
und wie kann ich das Problem lösen?Code:BLA=`ssh root@server date` & echo $BLA
thx,
tom
Hast du mal dran gedacht, dass BLA erst dann gesetzt ist, wenn der Befehl terminiert hat? Vorher ist BLA leer (und ändert sich auch nicht; du kannst einen beliebigen Wert vorher hineinschreiben, er bleibt erhalten).
naja, mit dem & schick ichs doch bloss in den hintergrund und wenn das fertig ist müsste doch ansich $BLA gefüllt werden, schliesslich beendet sich der befehl ja auch.
tom
Nein, du erstellst damit eine Race-Condition, die aber aufgrund des langsamen Verbindungsaufbaus immer zugunsten des echos ausgeht.
hmm und hast du nen idee für eine lösung? ich wollt in einem script eine ganze reihe änlicher sachen parallelisiert abschicken und dann später die rückgaben in den variablen auswerten. Sequentiell dauert einfach zu lange.
ach btw. das echo kommt nicht sofort nach dem ssh, ich glaube da haben wir uns falsch verstanden. mir ging es darum, das sobald ich den befehl in den hintergrund schiebe, BLA immer leer ist, auch wenn ich mit dem echo $BLA 10 Sekunden warte!!!
tom
Geändert von meinereinerseiner (29-04-2011 um 09:13 Uhr)
Zeig am besten mal das ganze Skript.
Ansonsten kannst du natürlich auch gruppieren:
Code:( BLA=$(ssh root@serverA date) ; echo ServerA: $BLA ) & ( BLA=$(ssh root@serverB date) ; echo ServerB: $BLA ) &
mal ein beispiel:
liefert im Endeffekt:Code:#!/bin/sh (A1=`ssh root@10.100.106.41 date` ) & (B1=`ssh root@10.100.106.42 date` ) & (C1=`ssh root@10.100.106.43 date` ) & (D1=`ssh root@10.100.106.44 date` ) & (E1=`ssh root@10.100.106.45 date` ) & A2=`ssh root@10.100.106.41 date` B2=`ssh root@10.100.106.42 date` C2=`ssh root@10.100.106.43 date` D2=`ssh root@10.100.106.44 date` E2=`ssh root@10.100.106.45 date` echo "Die 1er: -$A1- -$B1- -$C1- -$D1- -$E1-" echo "Die 2er: -$A2- -$B2- -$C2- -$D2- -$E2-"
Code:Die 1er: -- -- -- -- -- Die 2er: -Fr 29. Apr 10:35:56 CEST 2011- -Fr 29. Apr 10:35:56 CEST 2011- -Fr 29. Apr 10:35:56 CEST 2011- -Fr 29. Apr 10:35:57 CEST 2011- -Fr 29. Apr 10:35:57 CEST 2011-
( befehl )
führt befehl in einer neuen Shell aus und kann die aktuelle Shell nicht beeinflussen — folglich kannst du dann auch auf Variablen darin nicht zugreifen.
Damit man dein Problem lösen kann, braucht man tiefergehendes Verständnis desselben, die Beispiele führen hier nicht weiter.
ich möchte einfach nur parallelisiert auf mehreren kisten remote das ein oder andere command ausführen und die rückgabe in eine variable schreiben. es geht ja Sequentiell problemlos, wie teil 2 im script, aber eben nicht parallel.
tom
einfach befehle mit & ausführen
und dann am ende mit dem befehl wait warten
bis alle fertig sind und die ausgabe erst dann vernweden
@msi: Das klappt auch nicht, egal wie man es macht.
@meinereinerseiner: Was willst du denn genau machen?! Gib mal dein Skript an, mit den Beschreibungen kann man wenig anfangen.
siehe Post #7, da ist doch das script. Im Orginal werden auf den Servern andere Scripte aufgerufen, aber das date erfüllt an dieser Stelle zum Vernschaulichen vollends den selben Zweck.
Anderer Einfall: Was spricht denn eigentlich dagegen, temporäre Dateien zu benutzen?
Sähe dann so aus:
Code:tmpdir="$(mktemp --tmpdir=/tmp/ -d paralellSSH_XXXXXX)" for i in serverA serverB serverC do ( ssh "root@$i" date ; echo __SSH_DONE__ ) > "$tmpdir/$i" & done while : do err=0 for i in serverA serverB serverC do [[ "$(tail -n1 "$tmpdir/$i" 2> /dev/null)" != __SSH_DONE__ ]] && { err=1 ; sleep 1 ; break ; } done [[ $err -eq 0 ]] && break done for i in serverA serverB serverC do echo "Server: $i ; $(head -n+1 "$tmpdir/$i")" done rm "$tmpdir" -rf
Lesezeichen