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 tty
Ausgabefeld 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 ps
dem -U
Schalter ' 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 --deselect
Schalter 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 ps
einen -C
Schalter, mit dem wir nach Befehlsnamen auswählen können. Wir haben gerade unsere Befehlsliste bekommen, also lasst sie uns in die ps
Befehlszeile einfügen. Beachten Sie, dass ich --deselect
danach 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,args
die vorherige Zeile ergänzen , um den Wert tty
jedes Prozesses (und dessen vollständige Befehlszeile) auszugeben :
$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --deselect -o tty,args | grep ^?
Das Finale grep
fä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 ^?
network-manager
nicht istNetworkManager
.