Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : init-Script für Linux mit skip-Funktion...



SeeksTheMoon
26-06-2003, 13:55
ich hätte in einigen init-Scripts bei mir gerne eine Funktion, die dieses Script überspringt, wenn es nicht innerhalb von 5 Sekunden ausgeführt worden ist.

Ein Beispiel:
Ich benutze Ip@ctive für eine dynamische Namenszuweisung. Wenn das Script beim booten angeworfen wird, aber den Server nicht erreichen kann, oder aus einem anderen Grund nicht fertig wird, dann hängt der Rechner an diesem völlig unwichtigen Script beim booten fest.

Hier mal der Ausschnitt mit start:


case "$1" in
start)
echo "Starte IP@ctive-Client"
/sbin/ipactive_client > /dev/null 2>&1
evaluate_retval
;;

wie müsste ich das ändern, damit nach 5 Sekunden der Bootvorgang weiterläuft und der Rest dieses Scripts ignoriert wird (höchstens ne Fehlermeldung auf dem Screen)?

anda_skoa
26-06-2003, 16:06
Starte das Programm mit &, also im Hintergrund.
Dann steht in der Variable $! (wenn ich nicht irre) dessen PID.

Du machst dann ein sleep 5 und danach ein kill auf die PID

Mal so als Ansatz.

Ciao,
_

pitu
26-06-2003, 16:41
echo -n "Starte IP@ctive-Client"
found=0;
for i in 1 2 3 4 5; do
ping -c 1 server_der_zu_erreichen_ist
test "$?" = "0" && found=1 && break
echo -n " ."
sleep 1;
done

if [ $found -eq 1 ]; then
/sbin/ipactive_client > /dev/null 2>&1
echo "done!"
else
echo "Server not found."
fi


Das ist ein Ansatz den ich aus dem SuSE startscript fuer yp abgeleitet habe, natuerlich weiss ich nicht obs so funktioniert ;) Jedenfalls ists auch nur ein Ansatz.

gruss,
pitu

SeeksTheMoon
26-06-2003, 17:45
Original geschrieben von anda_skoa
Starte das Programm mit &, also im Hintergrund.
Dann steht in der Variable $! (wenn ich nicht irre) dessen PID.

Du machst dann ein sleep 5 und danach ein kill auf die PID

Mal so als Ansatz.

Ciao,
_

$! stimmt schonmal, aber da sind noch 2 Dinge, die mir nicht ganz passen (jetzt wirds tricky :D):
1) Der kill nach dem sleep killt den Prozess doch immer nach 5 Sekunden, also auch wenn er erfolgreich (als daemon) läuft
2) Wenn der Prozess erfolgreich läuft und dazu weniger als 5 Sekunden braucht, dann warte ich ja die restliche Zeit umsonst.

pitus Ansatz würde zwar klappen, ist mir aber zu speziell (gilt nur für Programme, die etwas im Netz erledigen) und er setzt voraus, dass der Server sich pingen lässt, was man ja per Firewall unterbinden kann.

pitu
26-06-2003, 18:05
Nein, eigentlich nicht. Du kannst ja jedes beliebige andere programm nehmen um ein $? zu erzeugen, z.B.ein ps mit einem grep, ein durchsuchen eines logfiles etc irgendetwas, dann geht das immer. Statt dem ping kannst du ja auch irgendeinen anderen test nehmen, einen telnet auf den port? oder was auch immer.

gruss,
pitu

anda_skoa
26-06-2003, 21:20
Original geschrieben von SeeksTheMoon

1) Der kill nach dem sleep killt den Prozess doch immer nach 5 Sekunden, also auch wenn er erfolgreich (als daemon) läuft


Hmm.
Die normalen Daemons forken sich und der Ursprungprozess beendet.

Beendet sich dieses Programm nicht?



2) Wenn der Prozess erfolgreich läuft und dazu weniger als 5 Sekunden braucht, dann warte ich ja die restliche Zeit umsonst.


Hmm.
Schreibt das Programm bei Erfolg etwas aus stdout oder stderr.
Wenn ja könnte man das in eine Datei umleiten und wie bei pitu's Ansatz in einer Schleife warten und in jedem Durchlauf das File kontrollieren.

Wenn der Prozess beendet (was ich eigentlich schon annehme, aber dein anderer Kommentar lässt mich ein bischen zweifeln), tut er es in einem Fall vielleicht mit eine anderen Returnwert.
Dann könnte man einen Aufruf mit && starten, der ein touch macht und in der Schleife kontrolliert man dann die Existenz oder das Änderungsdatum dieses Files.

Ciao,
_