UDM Zombie-Prozess

Liebe Entwickler,

ich habe gerade folgendes Verhalten festgestellt:

Wenn man mithilfe des udm-Befehls beispielsweise die Details eines Benutzers ansieht, also etwa so:

udm users/user list --filter uid=roland

werden die Details des Benutzer (hoffentlich) wie erwartet angezeigt. Es entsteht dabei aber auch - weniger erwartet - ein Zombie-Prozess:

root     21208  0.7  0.0      0     0 ?        Z    11:32   0:00 [univention-cli-] <defunct>

Welcher sich nach etwa fünf bis zehn Minuten selbst beendet.
Das wird wohl kein gewolltes Verhalten sein, oder?

An sich hätte ich kein Problem damit, aber ich habe für einen Syncer, der alle 3 Minuten laufen soll, eine Prüfung eingebaut, die nachsieht ob in dem Output “disabled: 1” drin steht und so herausfindet, ob der Benutzer gesperrt ist oder nicht.
Dieser Syncer kann nun aber nicht mehr so oft laufen, weil die Lock-Datei durch den Zombie erst viel später freigegeben wird. Meist waren es auf meinem Testsystem 7 Minuten.

Getestet habe ich es ursprünglich auf einem UCS 4.3.x (die genaue Version weiß ich nicht mehr), aber ein Update auf 4.4.5 und schließlich auf 4.4.6 hat dahingehend nichts verändert.

Woher kommt dieser Zombie?
Gibt es mit Python eine bessere Möglichkeit zu prüfen, ob ein Benutzer deaktiviert ist oder nicht?

LG,
Roland.

Nein, das ist sicherlich kein gewolltes Verhalten - es handelt sich um einen bekannten Bug. Da der Prozess mit der Zeit verschwindet ist das nur “unschön” aber nicht schlimm.

Sehe ich auch so, dass das nicht schlimm ist.
Ich habe jetzt mal genau nachgemessen: er beendet sich interessanterweise immer nach exakt 5 Minuten.

Wenn jemand ein Python-Code-Schnipsel für mich hätte, das prüft ob ein Account deaktiviert ist oder nicht und keinen Zombie erzeugt, würde ich mich freuen.

LG,
Roland.

Hi nochmal,
für den unwahrscheinlichen Fall, dass sonst noch jemand das hier braucht:
Ich habe die Lösung selbst gefunden:
(das Skript sucht nach Benutzern, deren uid mit msw beginnt und gibt True aus, falls der Account deaktiviert ist - dabei entsteht kein Zombie-Prozess)

from univention.udm import UDM

user_mod = UDM.admin().version(1).get('users/user')
for obj in user_mod.search('uid=msw*'):
    print(obj.props.firstname, obj.props.lastname)
    print(obj.props.disabled)

Das Timeout des univention-cli-server kann per UCR-Variable directory/manager/cmd/timeout definiert werden und ist standardmäßig 300 Sekunden.

Welche Lock-Datei meinen Sie? Gibt es Fehlermeldungen diesbezüglich, wenn z.B. eine weitere UDM Abfrage geschieht?

Ah, diese Zeit kann man einstellen, interessant. :slight_smile:

Die Lock-Datei, die ich gemeint habe, wurde von einem von mir selbst erstellten Skript erzeugt, damit nicht 2 Sync-Prozesse gleichzeitig laufen können. Und da sie auf das Ende des univention-cli-servers gewartet haben, blieb dies immer für 5 Minuten gesperrt.

Nein, es gab keine Fehlermeldungen bei weiteren UDM-Abfragen - alles gut.
Danke für die Nachfrage.

Das Problem ist, dass der UDM-CLI-Client einen UMC-CLI-Server forkt ohne die Filedeskriptoren zu schließen, dadurch werden die FD’s aus Ihrem Script an den Server-Prozess vererbt.
Wenn Sie in ihrem Script die FD’s schließen solltte das Problem nicht auftreten. Z.b. per subprocess.call(['udm', 'users/user', 'list', ...], close_fds=True).