Wie liste ich alle laufenden Daemons auf?

32

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 service --status-allBefehl zum Auflisten aller Daemons in meinem System verwendet werden kann. Ich glaube jedoch nicht, dass der Befehl alle Dämonen auflistet, da NetworkManagerein Dämon, der derzeit in meinem Ubuntu 14.04System ausgeführt wird, vom Befehl nicht aufgelistet wird. Gibt es einen Befehl, um die laufenden Daemons aufzulisten, oder gibt es eine Möglichkeit, die Daemons von filesystemsich aus zu finden ?

Jackzz
quelle
Sind Sie sicher, dass es nicht aufgeführt ist? Wie überprüfst du? Ich kann es auf meinem Debian sehen. Beachten Sie, dass der Name network-managernicht ist NetworkManager.
terdon
Ja. Ich bin mir sicher. Es ist nichts aufgeführt, was mit dem Begriff Netzwerk zu tun hat. Außerdem listet es auf, anacronwas in seinem Init-Skript als kein Dämon erwähnt wird.
Jackzz
Anacron, das kein Daemon ist, ist eher eine Frage der Semantik, da es nicht ständig ausgeführt wird. Es wird weiterhin als Dienst ausgeführt, den Sie normalerweise als Daemons bezeichnen. Bitte bearbeite deine Frage und ich) sage uns, welches Ubuntu du ausführst und ii) was genau du mit "Daemon" meinst. Was ist Ihr Endziel hier?
terdon
Ich nehme an, jeder Dienst, der im Hintergrund ausgeführt wird, ist ein Daemon. Ich erwähnte, anacronweil gesagt wurde, /etc/init.d/anacrondass es kein Daemon ist. Mein Ziel ist es, ein C++Programm zu schreiben , um alle auf meinem System laufenden Daemons aufzulisten. Dafür muss ich wissen, welche Dateien zu analysieren sind, um die Details zu erhalten.
Jackzz
1
Nun, wenn Sie Daemons als Dienste definieren, service --status-allist dies das , was Sie brauchen. Ubuntu scheint NetworkManager anders zu behandeln. Ich bekomme beides networkingund network-managerin der Ausgabe von services --status-allauf Debian aber nur networkingauf Ubuntu. Ich denke, Sie müssen definieren, was genau Sie mit "Daemon" meinen.
terdon

Antworten:

52

Der Begriff Daemon wird an Prozesse angehängt , nicht an Dateien . Aus diesem Grund macht es keinen Sinn, "Daemons 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 meiner Antwort angegeben habe , können wir laufende Daemons finden, indem wir nach Prozessen suchen, die ohne ein daran angeschlossenes Controlling-Terminal ausgeführt werden . Das geht ganz einfach mit ps:

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

Das ttyAusgabefeld 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 (z. B. Chromium) keinem Terminal zugeordnet sind, werden sie auch in der Ausgabe angezeigt. In einem Standardsystem, in dem root keine Grafikprogramme ausführt, können Sie die vorherige Liste einfach auf die Prozesse von root beschränken. Dies kann mit psdem -USchalter ' erreicht werden .

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

Dabei 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 zum Startzeitpunkt starten, normalerweise als Root ausgeführt werden.

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

Zunächst erstellen wir eine Liste aller GUI-Programme, für die Prozesse ausgeführt werden. Nach der Antwort, die ich gerade verlinkt habe, geschieht dies mit ...

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

Hat jetzt pseinen -CSchalter, mit dem wir nach Befehlsnamen auswählen können. Wir haben gerade unsere Befehlsliste bekommen, also lasst sie uns in die psBefehlszeile einfügen. Beachten Sie, dass ich --deselectdanach 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 "no TTY attached" Regel. Dazu werde ich -o tty,argsdie vorherige Zeile ergänzen , um den Wert ttyjedes Prozesses (und dessen vollständige Befehlszeile) auszugeben :

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

Das Finale grepfängt alle Zeilen ein, die mit "?" Beginnen, dh alle Prozesse ohne Kontroll-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 noch verbessern können, indem Sie beispielsweise Kernel-Threads ausschließen (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 ein paar Spalten mit Informationen 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 ^?
John WH Smith
quelle
Linux hält viele Informationen über ein virtuelles Dateisystem, procfs. so ist es machbar "Daemons auf dem Dateisystem zu finden" !!!
Massimo,
0

Ich habe für das "alte" sysv initd geschrieben, du musst prüfen, ob es auf deiner Distribution funktioniert.

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

Woher kennt init beim Ändern des Runlevels die laufenden Daemons?

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 überprüfen Sie, ob der Name in der Liste enthalten ist: Bingo!

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

/ proc

Wenn es sich bei dem Namen um Ziffern handelt, ist dies die PID eines laufenden Prozesses.

Der Status des Prozesses mit PID 1234 ist beispielsweise diese Datei

/ proc / 1234 / status

Öffne es und erhalte die erste Zeile, beginnend 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 üble Formatierung, ich schreibe von meinem Handy ...)

Massimo
quelle