Diese Website existiert nur weil wir Werbung mit AdSense ausliefern.
Bitte den AdBlocker daher auf dieser Website ausschalten! Danke.

[solved] shellscript: kurze frage...

Alles rund um die verschiedenen Konsolen und shells sowie die Programmierung unter Linux

Moderator: Moderatoren

Antworten
Gast

[solved] shellscript: kurze frage...

Beitrag von 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: Alles auswählen

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: Alles auswählen

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...
stakk
Newbie
Newbie
Beiträge: 5
Registriert: 25. Feb 2004, 12:06

Beitrag von stakk »

oops, das war ich! hatte mich evrgessen einzuloggen :wink:
genius667

Beitrag von genius667 »

$? 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: Alles auswählen

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: Alles auswählen

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
Newbie
Beiträge: 5
Registriert: 25. Feb 2004, 12:06

Beitrag von stakk »

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 :)
stakk
Newbie
Newbie
Beiträge: 5
Registriert: 25. Feb 2004, 12:06

Beitrag von stakk »

okay, eine frage hab ich jetzt doch noch:
Du solltest also nochmal ne Abfrage machen, ob in der Rückgabe grep vorkommt und dieses dann nicht mitwerten.
Wie kann ich denn die ausgabe abfragen ? ...

vllt denkfehler...
genius667

Beitrag von genius667 »

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: Alles auswählen

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: Alles auswählen

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: Alles auswählen

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
Newbie
Beiträge: 5
Registriert: 25. Feb 2004, 12:06

Beitrag von stakk »

danke fuer die Antworten :)


kriege das aber nicht realsiert...

hier noch mal mein ausgangscode

Code: Alles auswählen

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 ;)
poiin2000
Member
Member
Beiträge: 55
Registriert: 29. Jan 2004, 17:04
Wohnort: Pforzheim
Kontaktdaten:

Beitrag von poiin2000 »

Code: Alles auswählen

echo -e "\n**Keine aktuellen GameServerProzesse vorhanden!!**\n\n"
stakk
Newbie
Newbie
Beiträge: 5
Registriert: 25. Feb 2004, 12:06

Beitrag von stakk »

hehe jo thx ;) die steuerzeichen wollte ich mir eh angewoehnen lol
genius667

Beitrag von genius667 »

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
Gast

Beitrag von 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
Antworten