file zum an-/abschalten

Nemesis

Nemesis

N3RD
hi,
irgendwie habe ich nen narren an xdesktopwaves gefressen ;)
jetzt will ich mir ein shellscript basteln, damit ich mir nen button auf den desktop legen kann, der es mir startet/beendet.
das script muss überprüfen, ob nicht schon xdesktopwaves läuft, tut es das, muss es "xdesktopwaves -end" aufrufen, existiert noch kein slcher prozess muss es nur "xdesktopwaves" aufrufen.
den prozess bekomme ich über "ps -e | grep xdesktopwaves", nur steige ich durch die if funktion nicht ganz durch.
das müsste doch dann heissen:
Code:
#!/bin/bash
if "ps -e | grep xdesktopwaves"=1 ; then
"xdesktopwaves -end"
else
"xdesktopwaves"
fi
aber irgendwas passt da noch nicht, ich glaube dass das daran liegt, dass ich den prozess nicht mit "1" für "es läuft" vergleichen darf.

kann mir da jemand weiterhelfen?

thx
 
Code:
if [ "$(ps -e | grep xdesktopwaves | grep -v grep)" ]; then
...

Gruss, Xanti
 
Hallo

Mach es dir mal etwas einfacher, und speichere den Wert in einer Variablen.
Dann wird es auch klarer für dich, wie es mit if funktioniert.
Es geht auch anders, aber dann solltest du den Rückgabewert von grep auswerten.
Hier ein Beispiel für Variante 1
Code:
TEST=$(ps -e | grep "[x]desktopwaves");
if [ -n "$TEST" ]; then
echo "Test ist nicht leer, Programm läuft";
...
else
echo "Test ist leer, also nicht gestartet";
...
fi

Beim Starten des Programmes, solltest du noch den vollen Pfad hinzufügen.
Siehe auch Umgebungsvariablen für nicht interaktive Shell und angrenzende Probleme.

Gruß Wolfgang
 
hi,
so funktionierts, jetzt hab ich auch kapiert, wie das mit der if funktion funktioniert :)
Code:
if [ das zutrifft ]; then
"mach das"
else
"mach jenes"
fi

ich habs jetzt:
Code:
TEST=$(ps -e | grep "[x]desktopwaves");
if [ -n "$TEST" ]; then
#echo "Test ist nicht leer, Programm läuft";
xdesktopwaves  -end &
else
#echo "Test ist leer, also nicht gestartet";
xdesktopwaves &
fi

und es funktioniert :)

eine frage bleibt aber noch:
warum ist das x in eckigen klammern?:
TEST=$(ps -e | grep "[x]desktopwaves");

thx
 
Hallo
eine frage bleibt aber noch:
warum ist das x in eckigen klammern?:
TEST=$(ps -e | grep "[x]desktopwaves");
Um bei grep die bestehenden Prozesse in denen dein Suchwort matcht vom grep-Prozess zu unterscheiden.
Der Prozess grep "xdesktopwaves" matcht sonst selbst darauf.
Schau dir einfach mal die Ausgabe von
grep "xdesktopwaves" an.
Die shell löst so erst die Anfrage von grep auf, bevor es zum Match kommt.-> mit der [x].
Die Zeichenfolge muss so also auf ein x matchen, nicht aber auf eine eckige Klammer.
Hoffe es war verständlich.


Gruß Wolfgang
 
ich glaube ich verstehe worauf du hinauswillst, der befehl "ps -e | grep xdesktopwaves" erzeugt selbst auch wieder einen prozess, der das schlagwort "xdesktopwaves" enthält, diesen prozess möcht eman aber nicht haben, sondern man möchte ja den eigentlichen "xdesktopwaves" haben.
hm, nur sieht die ausgabe bei mir beidesmal gleich aus:
Code:
~$ ps -e | grep [x]desktopwaves
 5694 ?        00:00:00 xdesktopwaves
~$ ps -e | grep xdesktopwaves
 5694 ?        00:00:00 xdesktopwaves
müsste da dann nicht noch ein prozess ala "xxxx ? 00:00:00 grep xdesktopwaves" sein?

thx
 
Hallo
Entscheidend ist auch, welche Version von ps Verwendung findet.
Da das aber nicht bekannt war, habe ich eine Variante vorgeschlagen, die garantiert immer funktionieren sollte.
Wenn du das mal mit den Otionen ax versuchst, wirst du den Unterschied sehen.
Code:
[b]$ ps ax | grep "mozilla"
ps ax | grep "mozilla"
 3406 ?        Ssl    0:26 /usr/lib/mozilla/mozilla-bin -UILocale de-AT -ContentLocale AT -mail
 3739 pts/0    R+     0:00 grep mozilla

$ ps ax | grep "[m]ozilla"
 3406 ?        Ssl    0:27 /usr/lib/mozilla/mozilla-bin -UILocale de-AT -ContentLocale AT -mail[/b]

Natürlich kann man auch pgrep verwenden, so es verfügbar ist.

Gruß Wolfgang
EDIT/ Fipptehler korrigiert.
Hab die falsche Zeile zweimal hier reinkopiert.
 
Zuletzt bearbeitet:
hm, das verstehe ich noch nicht ganz mit der eckigen klammer, warum nimmt er dann da den prozess "/usr/lib/mozilla/mozilla-bin -UILocale de-AT -ContentLocale AT -mail" und nicht den "3739 pts/0 R+ 0:00 grep mozilla" ?
bei beiden ist doch die selbe zeichenfolge vorhanden.
 
Hallo
War ein Fehler von mir, habe leider zweimal die selbe Commandozeile erwischt.
Hab es korrigiert.
Hauptsache du hast es verstanden was ich meinte.
x Wählt Prozesse ohne kontrollierende ttys

Gruß Wolfgang
 
Wolgang is n bissl durch den wind (liegt sicher am Wetter ;) )

Code:
$ ps ax | grep "mozilla"
ps ax | grep "mozilla"
 3406 ?        Ssl    0:26 /usr/lib/mozilla/mozilla-bin -UILocale de-AT -ContentLocale AT -mail
 3739 pts/0    R+     0:00 grep mozilla

$ ps ax | grep "[m]ozilla"
 3406 ?        Ssl    0:27 /usr/lib/mozilla/mozilla-bin -UILocale de-AT -ContentLocale AT -mail
 
Goodspeed schrieb:
Wolgang is n bissl durch den wind (liegt sicher am Wetter ;) )

Code:
$ ps ax | grep "mozilla"
ps ax | grep "mozilla"
 3406 ?        Ssl    0:26 /usr/lib/mozilla/mozilla-bin -UILocale de-AT -ContentLocale AT -mail
 3739 pts/0    R+     0:00 grep mozilla

$ ps ax | grep "[m]ozilla"
 3406 ?        Ssl    0:27 /usr/lib/mozilla/mozilla-bin -UILocale de-AT -ContentLocale AT -mail

Aber nun stimmt es.

Gruß Wolfgang

Hast Recht, bin etwas durchs Wetter, liegt sicher am Wind. :D
 
hm, ok, aber die beiden zeilen:
Code:
3406 ?        Ssl    0:26 /usr/lib/mozilla/mozilla-bin -UILocale de-AT -ContentLocale AT -mail
 3739 pts/0    R+     0:00 grep mozilla

enthalten doch beide das wort mozilla, sowie en buchstaben m, warum nimmt er dann nur die 1.zeile, und lässt die mit dem grep weg?

da steige ich nicht ganz hinter die zeile, das ist glaube ich derschlüssel:
Die shell löst so erst die Anfrage von grep auf, bevor es zum Match kommt.-> mit der [x].
d.h. es wird ps ax durchgeschaut, bevor sich der eigentliche prozess "ps ax" darin befindet?
 
Hallo
Ich versuch es nochmal zu erklären.:headup:

Zunächst:
ps -ax listet alle Prozesse auf, auch die ohne tty.
grep "mozilla"
und
grep "[m]ozilla
matchen auf das gleiche Pattern.
Der Trick besteht nur darin, dass grep auch sich selbst findet, weil das Pattern mozilla darin vorkommt, jedoch nicht [m]ozilla.
Das [m]ozilla ist dabei Teil eines regulären Ausdrucks -> Zeichenklasse m gefolgt von ozilla.
Somit greift grep nicht mehr, da es ja nicht auf [m]ozilla matcht.
Hoffe du hast das diesmal verstanden.
Andere Möglichkeiten sind das über ein doppeltes grep zu realisieren
ps ax|grep "mozilla"|grep -v "grep"
-v negiert das gefundenen Pattern

HTH
Gruß Wolfgang
 
Somit greift grep nicht mehr, da es ja nicht auf [m]ozilla matcht.
ok, dann matcht das nicht auf den grep prozess, weil der [] enthält, der mozilla prozess aber nicht, wenn ich das jetzt richtig verstanden habe :think:
dann geben die klammern soviel an, wie: "ignoriere bei der suche die zeilen, welche die zeichenfolge inkl. klammern enthalten, und nimm die zeilen, welche nur die zeichenfolge enthalten", richtig so ?

edit:

jetzt hab ichs:
die zeichenfolge mozilla ist ja im mozilla-prozess die selbe wie im grep-prozess, also muss zum grep-prozess etwas hinzu, was die zeichenfolge ändert, nicht aber den prozess an sich, so wird der grep-prozess icht angezeigt, da er ja nicht der zeichenfolge entspricht :)

hat etwas länger gedauert, aber ich habs :)

thx
 
Zuletzt bearbeitet:

Ähnliche Themen

[gelöst] - for file in ... nur für bestimmte Endungen?

HandbrakeCLI Shell Skript

Kill Skript

Queue für copy Script

Shell-Skript nicht doppelt starten

Zurück
Oben