Race Condition in vdr init.d Skript

02/03/2014 - 08:54 von Marcel Müller | Report spam
Hallo,

ich habe einen Server (Wheezy), auf dem vdr (headless) bei Bedarf
gestartet wird. Also per inetd, sobald auf bestimmten Ports etwas rein
kommt. Soweit so gut.
Manchmal allerdings startet er den vdr zweimal, und dann geht restlos
gar nichts mehr, solange bis man manuell alle Prozesse gekillt hat.

Die Ursache habe ich möglicherweise gefunden. In dem Skript
/etc/init.d/vdr ist eine Race-Condition. Da steht sinngemàß immer etwas wie
if start-stop-daemon --start --test --pidfile ...
then
start-stop-daemon --start --pidfile ...
fi

Das geht natürlich voll in die Hose, wenn zufàllig mal zwei Requests
gleichzeitig rein kommen, was alle paar Wochen mal passiert.
Aber wie kommt man denn aus der Nummer raus? Ich meine, das gibt doch
keine Meter Sinn, wenn die Operation des Prüfens und Startens nicht
atomar ist.


Marcel
 

Lesen sie die antworten

#1 Stefan Enzinger
02/03/2014 - 11:45 | Warnen spam
On 2014-03-02 08:54, Marcel Müller wrote:

Manchmal allerdings startet er den vdr zweimal [..]

Die Ursache habe ich möglicherweise gefunden. In dem Skript
/etc/init.d/vdr ist eine Race-Condition. Da steht sinngemàß immer etwas wie
if start-stop-daemon --start --test --pidfile ...
then
start-stop-daemon --start --pidfile ...
fi

Das geht natürlich voll in die Hose, wenn zufàllig mal zwei Requests
gleichzeitig rein kommen



Also, ich check nicht ganzu was da passiert. "--test" sagt ob schon eine
instanz làuft?

als quick fix würde ich im init.d skript prüfen ob ein aussagekràftiger
prozess làuft.
eventuell das init.d skrip selbst oder vdr.
"man ps" ist dein freund, ich schàtze mal es wird auf ein
if ps -aC "vdr" | grep vdr --quiet
oder so hinuas laufen. ps hab ich allerdings nie verstanden, init auch
nicht.

An sich sollte man sich damit aber wohl an vdr wenden. Die sollten bugs
entfernen.

lg

Ähnliche fragen