• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[solved] shellscript: kurze frage...

A

Anonymous

Gast
hi all

dachte eigentlich das dies problemlos geht, was aber nicht der fall war!

Ich mach folgendes:

ich frage ab ob der rueckgabewert von

Code:
ps -aux | grep server_l&

0 oder 1 ist

ist er 1 soll er ne meldung machen das keine server laufen...(das fuehr ich nich aus um was es sich hier genau geht ;) )

andernfalls soll er die prozess-ausgabe machen und normal weiterlaufen

So... da die abfrage im hintergrund passieren soll, hab ich ein' &' am ende angefuegt! hmm aber es funktioniert nicht....

Code:
ps -aux | grep server_l&      
   sleep 2
     if [ "$?" = "1" ]; then   
   echo " **Keine aktuellen voiceServerprozesse vorhanden!!**"
   
   else 
   ps -aux | grep server_l
    echo ""
    sleep 1
   .
   .
   .

kann es sein das der lediglich das grep im hintrgrund ausfuehrt und ps vollkommen unberuehrt bleibt vom '&'??

Setz ich ein '&' hinter ps -aux , dann meckert er das er die pipe nicht kennt oder erwartet...

Hmm vielleicht komme ich selber drauf aber waere super wenn mir jemand weiterhelfen kann...
 
OP
A

Anonymous

Gast
$? speichert immer den Returnwert des letzten Ausgeführten Befehls, der letzte Befehl deines Scripts, bevor der Vergleich mit $? kommt is sleep 2, da der Befehl mit sehr hoher Wahrscheinlichkeit immer erfolgreich ausgeführt wird, ist der Wert in $? immer 0 unabhängig davon, was du vorher für einen bei deinem ps aux... Befehl hattest.

Um das Problem zu lösen, musst du den Return Value vorher zwischenspeichern und bei deinem if Vergleich anstatt $? $rv nehmen, z. B. so
Code:
ps -aux | grep bla

rv=$?
sleep 2
if [ "$rv" == "1" ]; then
    echo "bla bla bla"
fi

Du solltest auch bedenken, dass manchmal grep bla auch noch in ps drin is und deshalb 0 zurückgegeben wird. Du solltest also nochmal ne Abfrage machen, ob in der Rückgabe grep vorkommt und dieses dann nicht mitwerten.

Ich frag mich auch, warum du ein & hinter dem Befehl machen willst, die Ausgabe findet deshalb trotzdem noch auf dem Bildschirm statt, willst du verhindern, dass diese auf dem Bildschirm stattfindet, musst du

Code:
ps -aux | grep bla &>/dev/null

verwenden, dadurch wird die Ausgabe nach /dev/null geschickt, also gelöscht und erscheint nicht mehr auf dem Bildschirm.

mfg

Andy
 

stakk

Newbie
das mit sleep 2 war mir klar, das war nur zum testen ob die ausgabe kommt...
Aber das wiederum hat sich mit '& >/dev/null' ja geklärt... genau das wollt ich haben! Ich wusste nicht das es da gelöscht wird, wiedermal eine sache die ich wohl nicht richtig aufgenommen habe ...thx

Du hast vollkommen recht das grep bla in der liste der prozesse auftaucht, hab ich schon gemerkt... dies passiert aber nicht immer ..
Werde es so machen wie du vorgeschlagen hast


Ich danke dir auf jedenfall

Superschnelle und gute hilfe :)
 
OP
A

Anonymous

Gast
Gut ne komplizierte Abfrage braucht man vielleicht doch nicht, hab ich gerade bemerkt, aber du musst vorher den Wert von ps -aux in ne Variable speichern und dann mit grep nach dem Prozess suchen, z. B.:

Code:
PROZ=`ps -aux`
echo $PROZ | grep bla &>/dev/null
if [ "$?" == "1" ]; then
    echo "bla bla bla"
fi

Zum Thema Hintergrundprozesse &>/dev/null bewirkt nicht, dass es im Hintergrund ausgeführt wird, dies geschieht alles sehr wohl noch im Vordergrund, es findet nur keine Ausgabe mehr statt.

willst du dein ganzes Script im Hintergrund ausführen musst du es so starten:

Code:
sh script.sh &

Ausgaben finden jetzt immernoch auf dem Screen statt, aber das Programm läuft tatsächlich im Hintergrund. Für Hintergrundprozesse ist es allerdings nicht sehr toll, wenn die Ausgaben immer auf dem Bildschirm vorkommen, deshalb kannst du diese z. B. in eine Datei umleiten z.B.:

Code:
sh script.sh &>~/foo.log &

leitet die Standardausgabe und die Standardfehlerausgabe in die Datei foo.log im Homeverzeichniss um und führt das skript im Hintergrund aus.

mfg

Andy
 

stakk

Newbie
danke fuer die Antworten :)


kriege das aber nicht realsiert...

hier noch mal mein ausgangscode

Code:
ps -aux | grep server_l &>/dev/null
         
      if [ "$?" = "1" ]; then   
       echo ""
       echo " **Keine aktuellen GameServerProzesse vorhanden!!**"
       echo ""
       echo ""
      
      else

so, wenn beide server laufen, läuft einmal der 'server_linux' prozess und der 'server_lvent' prozess

Um mir sie auflisten zu lassen hab ich ja 'grep server_l' benutzt...

Ich verstehe es nun nicht wie ich ne abfrage mache, ob der grep-prozess vorhanden ist (nämlich der letzte fälschlich angezeigte prozess vom letzen grep)...


hmm ich hoffe du hast es verstanden ;)
 
OP
A

Anonymous

Gast
hab dir doch schon die Lösung gebracht, du brauchst keine extra Abfrage, wenn du die Ausgabe von ps -aux erst in ne Variable speicherst...

mfg

Andy
 
OP
A

Anonymous

Gast
jop, war gestern alles zuviel fuer mich hehe...
heute morgen nachm aufstehen, hab ich s sofort hinbekommen :)

Jaja eine nacht drueber schlafen wirkt wunder


DICKES THX nochmal an dich
 
Oben