PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bash: ssh remote command klapt nicht, wenn command im Hintergrund azsgeführt wird



meinereinerseiner
28-04-2011, 11:04
Hi,

mal zum verstandnis, warum geht:

BLA=`ssh root@server date`
echo $BLA

aber nicht:

BLA=`ssh root@server date` &
echo $BLA

und wie kann ich das Problem lösen?

thx,
tom

John W
28-04-2011, 23:28
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).

meinereinerseiner
29-04-2011, 06:45
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

John W
29-04-2011, 09:04
Nein, du erstellst damit eine Race-Condition, die aber aufgrund des langsamen Verbindungsaufbaus immer zugunsten des echos ausgeht.

meinereinerseiner
29-04-2011, 09:11
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

John W
29-04-2011, 09:14
Zeig am besten mal das ganze Skript.
Ansonsten kannst du natürlich auch gruppieren:


( BLA=$(ssh root@serverA date) ; echo ServerA: $BLA ) &
( BLA=$(ssh root@serverB date) ; echo ServerB: $BLA ) &

meinereinerseiner
29-04-2011, 09:39
mal ein beispiel:


#!/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-"

liefert im Endeffekt:

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-

John W
29-04-2011, 10:12
( 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.

meinereinerseiner
29-04-2011, 11:58
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

msi
29-04-2011, 12:42
einfach befehle mit & ausführen
und dann am ende mit dem befehl wait warten
bis alle fertig sind und die ausgabe erst dann vernweden

meinereinerseiner
29-04-2011, 12:53
einfach befehle mit & ausführen
und dann am ende mit dem befehl wait warten
bis alle fertig sind und die ausgabe erst dann vernweden

öhmm, nu komme ich garnicht mehr mit.

BLA=`ssh root@server date` & wait
ändert nix.

tom

John W
29-04-2011, 13:47
@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.

meinereinerseiner
29-04-2011, 14:04
@meinereinerseiner: Was willst du denn genau machen?! Gib mal dein Skript an, mit den Beschreibungen kann man wenig anfangen.

siehe Post #7 (http://www.mrunix.de/forums/showpost.php?p=330181&postcount=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.

John W
29-04-2011, 15:03
Anderer Einfall: Was spricht denn eigentlich dagegen, temporäre Dateien zu benutzen?
Sähe dann so aus:


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