Daemon Start Script

S

samysmurf

Hi @ all


ich hab ma ein Script gebastelt,

und jetzt hab ich ein paar probleme mit der
erkennung ob der Daemon schon läuft und nicht noch einmal gestartet wird :-)

Code:
schnipp

safestart)
ps aux | grep -v grep | grep $PORT > /dev/null
CHECK=$?
if [ $CHECK -eq 0 ]
then
echo "$DESC: $NAME laeuft bereits"
else
echo "Starte $DESC: $NAME"
if [ -e $DIR ];
then
cd $DIR
screen -d -m -S $NAME $DAEMON $PARAMS
else echo "Kein Verzeichnis: $DIR!"
fi
fi
;;


schnapp

ich möchte mittels grep die ps aux nach dem wert $PORT durchsuchen.
Der Wert entspricht z.B. 30100 und die Variable wird auch richtig übergeben

aber irgendwie findet er denn Wert nicht, bzw gibt ihn nicht weiter.
Denn er gibt mir immer aus das dieses Prog schon läuft :-/ ich
hab es auch schon mit nem Namen versucht, also den Deamon zusätzlich
mit einem sonst nicht benutzen Namen gestartet,
aber da bringt er auch immer das es schon läuft :-/



Wo liegt mein Fehler ??

Ich muss dazu sagen das ich noch ziemlich am Anfang meiner
Shell "Scripting Karierre" stehe :-)

Hoffe ihr könnt mir weiter helfen

MFG

Samy
 
Zuletzt bearbeitet von einem Moderator:
Dein Fehler liegt darin, dass 30100 auch eine PID sein kann. Laeuft also ein Programm mit dieser PID, erkennt dein Skript dies als dein Daemon.

Ausserdem ist der Befehl
Code:
ps aux | grep -v grep | grep $PORT > /dev/null
total unsinnig. Hast du den mal in einer Shell ausgefuehrt?
Code:
theton@BigTAPS:~> ps aux | grep -v grep | grep $PORT > /dev/null
Usage: grep [OPTION]... PATTERN [FILE]...
Try `grep --help' for more information.
Abgesehen davon wuerdest du im Erfolgsfall keinen Output bekommen, da du den ja nach /dev/null und damit ins Nirvana schickst.
 
@samysmurf: Du versuchst den exit-Status von grep auszuwerten, was aber misslingt, da dieser auch dann 0 ist, wenn er nichts gematcht hat (schliesslich hat er erfolgreich nix gematcht). ;)

Besser wäre, dass Du die Ausgabe von grep auf Nullstring testest (keine Ausgabe = Nullstring, Ausgabe != Nullstring). In der Art:

Code:
if [ "$(ps aux | grep -v grep | grep $PORT)" ]; then

Dass $PORT auch als PID vorkommen kann, darauf hat Dich theton bereits hingewiesen.

@theton: Mit "ps aux | grep -v grep" will man vermeiden, dass der grep-Befehl selber von grep gematcht wird. Vielleicht solltest Du der Variable PORT einfach mal einen Wert zuweisen. ;)

Gruss, Xanti
 
Zuletzt bearbeitet:
Hallo

Zunächst möchte ich auch hier den Rat geben, Variablen die als Pattern an grep übergeben werden immer gequotet zu übergeben.
Im Falle eines Leerstrings bekommst du sonst nicht das was du willst.
Dazu gab es neulich hier einen Thread, wo sogar jemand einen Bugreport verfassen wollte. ;)

Um den Exitstatus einer Pipe zu erhalten, schließe diesen einfach in Klammern ein.
Die Bash startet - anders als einige andere Shellinterpreter (ksh) - eine Subshell in der Pipe. Mit Klammerung kommst du aber immer auf den richtigen Wert.
Wenn grep matcht, ist dieser Null sonst 1 oder im Fehlerfall >1.
Code:
$ CHECK=$((ps aux | grep -v "grep" | grep "$PORT">/dev/null); echo $?);
$ echo $CHECK
0
$ PORT="UNMOEGLICH"
$ CHECK=$((ps aux | grep -v "grep" | grep "$PORT">/dev/null); echo $?);
$ echo $CHECK
1

Gruß Wolfgang
 
Wolfgang schrieb:
...

Um den Exitstatus einer Pipe zu erhalten, schließe diesen einfach in Klammern ein.
...

Wieder was gelernt. Kommt in meine Notizensammlung.

Gruss, Xanti
 

Ähnliche Themen

Switche abfragen über Script

Skript soll nicht doppelt laufen... kill pkill pid cron

NAS-Drive Mount in Bash-Script über crontab

Verschlüsseltes Backup-Script mit rsync

Rückgabe eines Befehls

Zurück
Oben