Mir ist zunächst folgendes aufgefallen:
Die Beschreibung der Funktion ist nicht korrekt/vollständig: Es gibt return 4 und 5, außerdem echo Anweisungen.
Die Vorbelegung von Parametern bringt nichts. Port 21 ist nur sinnvoll für FTP, aber dann paßt der Name "daemon" nicht dazu. "check" und "TCP" ist vielleicht häufiger, aber ich würde es vorziehen, die Parameter explizit zu übergeben. Von der Reihenfolge würde ich erst das Kommando übergeben, dann Socket Typ und Port, die ja zusammen gehören.
Ansonsten bist Du anscheinend ein Fan von sed und Sub-Shells.
Erwartest Du Leerzeichen im Namen des Programms? Ich denke, das kann man ausschließen. Also ist es einfacher, das letzte Wort in der Zeile zu suchen. Das hat auch den Vorteil, daß es wirklich mit den Port-Type UDP und RAW funktioniert, bei denen kein LISTEN angezeigt wird.
Warum Du da "grep -E" verwendest, ist mir nicht klar. Oder hätte es "grep -F" sein sollen? Außerdem haben wir schon sed, da brauchen wir nicht noch grep.
Code:
local pidname="$(netstat -lnp"$sockettype" | sed -nre "s/^.*:$netport .* ([^ ]+) *\$/\\1/p"
local mypid=${pidname#*/}
local myname=${pidname%/*}
Ein Server könnte an mehrere Interfaces jeweils mit dem gleichen Port gebunden sein. Das wird weder von Deiner Version noch von meiner oben abgedeckt.
In der inetd.conf könnte der Port als Name eingetragen sein, dann würde er nicht gefunden. Tatsächlich werden aber anscheinend immer nur die Nummern verwendet.
Außerdem könnte es sein, daß die Funktion aufgrund einer Änderung der Konfiguration aufgerufen wird, oder einfach nachdem die Konfiguration geändert wurde, und deswegen in der inetd.conf der Dienst gar nicht mehr aktiv ist. Da wir ja die Pid haben, können wir diese mit /var/run/inetd.pid vergleichen für den Freetz inetd. Vielleicht hat der von AVM auch eine Pid Datei, wenn nicht, kann man wohl davon ausgehen, daß es nicht noch einen dritten inetd geben wird.
Im Fall, daß das Programm über inetd gestartet wird, Nimmst Du alles nach dem letzten '/' als Programm Name. Bei meiner inetd.conf auf dem PC kommt da in keinem Fall der Name des Servers heraus, aber vermutlich funktioniert es in den von Dir getesteten Fällen auf der Box.
Im Fall, daß der Dienst über inetd läuft, wird trotzdem die rc-Aktion stop ausgeführt. Ist beabsichtigt, daß diese die inetd.conf ändert? Wenn nicht, kann man sich den Aufruf gleich sparen. Zumal im Moment jeder Fehler beim Stop als "inetd" interpretiert wird, was nicht zwangsläufig so sein muß.
Außerdem haben wir schon Funktionen zum Stoppen von Diensten, deren Pid bekannt ist. Die könnte man hier aufrufen, statt das hier nochmal zu machen.