Anzeige:
Ergebnis 1 bis 14 von 14

Thema: Bash: ssh remote command klapt nicht, wenn command im Hintergrund azsgeführt wird

  1. #1
    Registrierter Benutzer
    Registriert seit
    09.01.2001
    Beiträge
    242

    Question Bash: ssh remote command klapt nicht, wenn command im Hintergrund azsgeführt wird

    Hi,

    mal zum verstandnis, warum geht:
    Code:
    BLA=`ssh root@server date`
    echo $BLA
    aber nicht:
    Code:
    BLA=`ssh root@server date` &
    echo $BLA
    und wie kann ich das Problem lösen?

    thx,
    tom

  2. #2
    Registrierter Benutzer Avatar von John W
    Registriert seit
    29.01.2010
    Beiträge
    211
    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).

  3. #3
    Registrierter Benutzer
    Registriert seit
    09.01.2001
    Beiträge
    242
    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

  4. #4
    Registrierter Benutzer Avatar von John W
    Registriert seit
    29.01.2010
    Beiträge
    211
    Nein, du erstellst damit eine Race-Condition, die aber aufgrund des langsamen Verbindungsaufbaus immer zugunsten des echos ausgeht.

  5. #5
    Registrierter Benutzer
    Registriert seit
    09.01.2001
    Beiträge
    242
    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 10:13 Uhr)

  6. #6
    Registrierter Benutzer Avatar von John W
    Registriert seit
    29.01.2010
    Beiträge
    211
    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 ) &

  7. #7
    Registrierter Benutzer
    Registriert seit
    09.01.2001
    Beiträge
    242
    mal ein beispiel:

    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-"
    liefert im Endeffekt:
    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-

  8. #8
    Registrierter Benutzer Avatar von John W
    Registriert seit
    29.01.2010
    Beiträge
    211
    ( 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.

  9. #9
    Registrierter Benutzer
    Registriert seit
    09.01.2001
    Beiträge
    242
    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

  10. #10
    Registrierter Benutzer
    Registriert seit
    14.01.2002
    Beiträge
    657
    einfach befehle mit & ausführen
    und dann am ende mit dem befehl wait warten
    bis alle fertig sind und die ausgabe erst dann vernweden

  11. #11
    Registrierter Benutzer
    Registriert seit
    09.01.2001
    Beiträge
    242
    Zitat Zitat von msi Beitrag anzeigen
    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.
    Code:
    BLA=`ssh root@server date` & wait
    ändert nix.

    tom

  12. #12
    Registrierter Benutzer Avatar von John W
    Registriert seit
    29.01.2010
    Beiträge
    211
    @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.

  13. #13
    Registrierter Benutzer
    Registriert seit
    09.01.2001
    Beiträge
    242
    Zitat Zitat von John W Beitrag anzeigen
    @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.

  14. #14
    Registrierter Benutzer Avatar von John W
    Registriert seit
    29.01.2010
    Beiträge
    211
    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •