Dienste bei Bedarf starten

09/11/2016 - 08:30 von Marcel Mueller | Report spam
Moin,

ich habe relativ oft die Anforderung, dass bestimmte Dienste nur bei
Bedarf gestartet werden sollen. Dabei denkt man natürlich zuerst an
inetd und Konsorten.
Nur verlangt der Bursche in der Praxis, dass jeder einzelne Dienst dafür
spezielles inetd-Coding enthàlt (letztlich eine Art Dependency-Injection
ohne passendes Framework). Das ist natürlich nicht der Fall, und in
einigen Fàllen auch ziemlich abwegig.
Beispiele:

- Virtuelle Maschinen über RDP,
- vdr Server (Streaming, vdr-live)

Allen gemein ist, dass die Dienste, wenn sie denn mal laufen, mehrere
Services zur Verfügung stellen und sich bei Inaktivitàt auch wieder
selber schlafen legen können. Ferner ist ihnen gemein, dass sie auch auf
anderen Wegen gestartet werden können (z.B. durch Timer Wakeups) und
nicht mehrfach laufen dürfen.

Natürlich könnte man jetzt argumentieren, lasse den Kram doch 24/7
laufen, aber ich bin weder gewillt die daraus resultierende
Stromrechnung zu bezahlen (SAT-Anlage fàhrt bei vdr hoch => 20€/Jahr;
CPU-Last der VMs), noch den für alle gelegentlich mal gebrauchen VMs
notwendigen Speicher immer zu verballern.


Derzeit behelfe ich mir mit einem Shell-Script, was ich inetd dann
implantiere:

#!/bin/sh
target="$1 $2"
shift 2
startupcmd=$*
logf=/tmp/daemonproxy.log

echo $$ verbinde $target </dev/null >>$logf
if ! nc -T lowdelay $target 2>>$logf; then
sleep 1 </dev/null >/dev/null;
if ! nc -T lowdelay $target 2>>$logf; then
echo $$ starte $startupcmd </dev/null >>$logf
$startupcmd </dev/null >>$logf 2>&1
retries=0
echo $$ verbinde erstmals $target </dev/null >>$logf
until nc -T lowdelay $target 2>>$logf; do
if [ $retries -ge 4 ]; then
echo $$ Verbindung fehlgeschlagen </dev/null >>$logf
exit 1
break;
fi
retries=$(( $retries+1 ))
sleep 1 </dev/null >/dev/null;
echo $$ erneuter Versuch \#$retries </dev/null >>$logf
done;
fi
fi
echo $$ Verbindung beendet $target </dev/null >>$logf

7908 stream tcp nowait root /usr/local/sbin/daemonproxy.sh
/usr/local/sbin/daemonproxy.sh 127.0.0.1 8008 /etc/init.d/vdr start

Dabei wird faktisch ein zweiter Proxy-Port aufgemacht, der sàmtlichen
Traffic dann per netcat an den eigentlichen Port weiter reicht.
Die Parameter an daemonproxy.sh sind der Zielport gefolgt vom Kommando
zum starten des Dienstes.

Das funktioniert zuverlàssig, aber ist natürlich aus Performancesicht
suboptimal, weil gerade bei RDP richtig etwas über die Leitung geht,
wenn z.B. Echtzeitinhalte in der VM laufen (z.B. Videos oder Spiele).
Aus diesem Grund suche ich nach einer besseren Lösung.

In der Sache ist das Problem, dass inetd die Verbindung letztendlich
herstellt. Damit hat das Zielprogramm natürlich nicht mehr die Chance,
seine Ports selbst zu öffnen.

Was ich eigentlich bràuchte, ist ein Wàchter auf eingehende
Verbindungen, der im Falle von geschlossenen Ports nicht gleich panisch
ablehnt, sondern erst mal versucht gemàß Config einen bestimmten Dienst
zu starten. Das würde das Portfolio vermutlich auch auf UDP-Dienste
ausdehnen, bei denen mein Hack nicht funktioniert.

Geht das nicht irgendwie?
Ich meine Firewalls bekommen Eingriffe auf der Ebene doch auch hin.

OS ist übrigens Debian Wheezy.
Aber letztlich kàme mir eine Lösung auf speicherschwachen Kisten, wie
Raspis auch zugute. Das ist aber faktisch auch Debian.


Ich weiß jetzt nicht so ganz in welche Gruppe das gehört. Einerseits ist
es ein Netzwerk-Thema, andererseits wird eine Lösung sicher nicht in
beliebigen Unixen laufen.
Bitte ggf. entsprechend umleiten.


Marcel
 

Lesen sie die antworten

#1 Peter J. Holzer
10/11/2016 - 07:08 | Warnen spam
On 2016-11-09 07:30, Marcel Mueller wrote:
ich habe relativ oft die Anforderung, dass bestimmte Dienste nur bei
Bedarf gestartet werden sollen. Dabei denkt man natürlich zuerst an
inetd und Konsorten.


[...]
Was ich eigentlich bràuchte, ist ein Wàchter auf eingehende
Verbindungen, der im Falle von geschlossenen Ports nicht gleich panisch
ablehnt, sondern erst mal versucht gemàß Config einen bestimmten Dienst
zu starten. Das würde das Portfolio vermutlich auch auf UDP-Dienste
ausdehnen, bei denen mein Hack nicht funktioniert.



Ich glaube gelesen zu haben, dass systemd so etwas zur Verfügung stellt.
Ich habe es allerdings bisher nicht gebraucht und mein Google-Fu làsst
mich auch gerade etwas im Stich.

hp


_ | Peter J. Holzer | Fluch der elektronischen Textverarbeitung:
|_|_) | | Man feilt solange an seinen Text um, bis
| | | | die Satzbestandteile des Satzes nicht mehr
__/ | http://www.hjp.at/ | zusammenpaßt. -- Ralph Babel

Ähnliche fragen