it-swarm.com.de

Wie liste ich alle laufenden Dämonen auf?

Aus meiner Frage ging hervor, dass ich die Funktionen eines Daemons nicht einfach bestimmen kann. Ich habe in verschiedenen Artikeln und in verschiedenen Foren gelesen, dass der Befehl service --status-all Zum Auflisten aller verwendet werden kann Dämonen in meinem System. Ich glaube jedoch nicht, dass der Befehl alle Dämonen auflistet, da NetworkManager, ein Dämon, der derzeit in meinem Ubuntu 14.04 - System ausgeführt wird, vom Befehl nicht aufgelistet wird. Gibt es einen Befehl zum Auflisten der laufenden Dämonen oder gibt es eine Möglichkeit, die Dämonen aus dem filesystem selbst zu finden?

36
Jackzz

Der Begriff Daemon ist an Prozesse angehängt, nicht an Dateien . Aus diesem Grund macht es keinen Sinn, "Dämonen im Dateisystem zu finden". Nur um den Begriff etwas klarer zu machen: Ein Programm ist eine ausführbare Datei (sichtbar in der Ausgabe von ls); Ein Prozess ist eine Instanz dieses Programms (sichtbar in der Ausgabe von ps).

Wenn wir nun die Informationen verwenden, die ich in meine Antwort angegeben habe, können wir laufende Daemons finden, indem wir nach Prozessen suchen, die ohne angeschlossenes Steuerungsterminal ausgeführt werden . Dies kann ganz einfach mit ps durchgeführt werden:

$ ps -eo 'tty,pid,comm' | grep ^?

Das Ausgabefeld tty enthält "?" wenn der Prozess kein steuerndes Terminal hat.

Das große Problem tritt hier auf, wenn auf Ihrem System eine grafische Umgebung ausgeführt wird. Da GUI-Programme (d. H. Chromium) nicht an ein Terminal angeschlossen sind, werden sie auch in der Ausgabe angezeigt. Auf einem Standardsystem, auf dem root keine grafischen Programme ausführt, können Sie die vorherige Liste einfach auf die Prozesse von root beschränken. Dies kann mit dem Schalter ps '-U Erreicht werden.

$ ps -U0 -o 'tty,pid,comm' | grep ^?

Hier treten jedoch zwei Probleme auf:

  • Wenn root grafische Programme ausführt, werden diese angezeigt.
  • Daemons, die ohne Root-Rechte ausgeführt werden, werden dies nicht tun. Beachten Sie, dass Daemons, die beim Booten starten, normalerweise als root ausgeführt werden.

Grundsätzlich möchten wir alle Programme ohne steuerndes Terminal anzeigen, aber keine GUI-Programme . Zum Glück gibt es ein Programm zum Auflisten von GUI-Prozessen: xlsclients! Diese Antwort von slm erklärt uns, wie wir damit alle GUI-Programme auflisten können, aber wir müssen sie umkehren, da wir sie ausschließen möchten. Dies kann mit dem Schalter --deselect Durchgeführt werden.

Zunächst erstellen wir eine Liste aller GUI-Programme, für die Prozesse ausgeführt werden. Aus der Antwort, die ich gerade verlinkt habe, geht hervor, dass ...

$ xlsclients | cut -d' ' -f3 | paste - -s -d ','

Jetzt hat ps einen -C - Schalter, mit dem wir nach Befehlsnamen auswählen können. Wir haben gerade unsere Befehlsliste erhalten, also fügen wir sie in die Befehlszeile ps ein. Beachten Sie, dass ich anschließend --deselect Verwende, um meine Auswahl umzukehren.

$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --deselect

Jetzt haben wir eine Liste aller Nicht-GUI-Prozesse. Vergessen wir nicht unsere Regel "kein TTY angehängt". Dazu füge ich der vorherigen Zeile -o tty,args Hinzu, um das tty jedes Prozesses (und seine vollständige Befehlszeile) auszugeben:

$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --deselect -o tty,args | grep ^?

Das letzte grep erfasst alle Zeilen, die mit "?" Beginnen, dh alle Prozesse ohne steuernde tty. Und los geht's! Diese letzte Zeile enthält alle Nicht-GUI-Prozesse, die ohne steuerndes Terminal ausgeführt werden. Beachten Sie, dass Sie es beispielsweise noch verbessern können, indem Sie ohne Kernel-Threads (die keine Prozesse sind) ...

$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --ppid 2 --pid 2 --deselect -o tty,args | grep ^?

... oder indem Sie einige Informationsspalten hinzufügen, die Sie lesen können:

$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --ppid 2 --pid 2 --deselect -o tty,uid,pid,ppid,args | grep ^?
52
John WH Smith

Ich habe für die "alte" sysv initd geschrieben, Sie müssen überprüfen, ob es auf Ihrer Distribution funktioniert.

Gute Dämonen haben gut geschriebene Startskripte in/etc/initd

Woher kennt init die laufenden Daemons, wenn er den Runlevel ändert?

Es sucht nach ihren Namen im Verzeichnis

/ var/lock/subsys

Also kannst du

holen Sie sich die Namensliste von dort

scannen Sie alle laufenden Prozesse und prüfen Sie, ob der Name in der Liste enthalten ist: Bingo!

So scannen Sie alle Prozesse: Listen Sie jedes Unterverzeichnis in auf

/ proc

Wenn der Name Ziffern ist, ist dies die PID eines laufenden Prozesses.

Der Status des Prozesses mit PID 1234 ist beispielsweise diese Datei

/ proc/1234/status

Öffnen Sie es und erhalten Sie die erste Zeile, beginnt mit "Name:"

Sehen

http://man7.org/linux/man-pages/man5/proc.5.html

https://linuxexplore.com/2014/03/19/use-of-subsystem-lock-files-in-init-script/

(Entschuldigung für die böse Formatierung, ich schreibe von meinem Handy ...)

0
Massimo