Wie überprüfe ich, ob ein Prozess ein Daemon ist oder nicht?

7

Ich habe einen kleinen Daemon geschrieben, der beim Booten beginnt und alles perfekt macht, wie das Schreiben in die Protokolldatei. Aber ich möchte wissen, wie wir überprüfen können, ob dieser Prozess ein Daemon ist oder nicht. Mein Professor hat mir von einem Befehl erzählt ps -xj | grep daemon(mein Dateiname ist daemon), aber ich bin davon nicht überzeugt, da er unerwünschte Informationen enthält. Gibt es dafür einen Shell-Befehl?

edit: Ich benutze Ubuntu 14.04 LTS

Pranjal
quelle

Antworten:

10

Alles mit der PPID 1 ist größtenteils wahrscheinlich ein Daemon. Es kann jedoch Situationen geben, in denen Prozesse zu Kindern von 1 werden können, die technisch gesehen keine Dämonen sind. Die Methoden, die ich unten diskutiere, sollen zeigen, wie Sie feststellen, ob eine PID 1 gehört, und nicht unbedingt, dass es sich um einen tatsächlichen Daemon handelt.

Zum Beispiel

$ ps -xj
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
 8420  1211  1211  8420 pts/4     1211 S+    1000   0:01 ssh dufresne
    1  2276  2275  2275 ?           -1 Sl    1000   0:48 /usr/bin/gnome-keyring-daemon --daemonize --login
 2196  2278  2278  2278 ?           -1 Ssl   1000   0:39 gnome-session
    1  2288  2278  2278 ?           -1 S     1000   0:00 dbus-launch --sh-syntax --exit-with-session
    1  2289  2289  2289 ?           -1 Ssl   1000   6:00 /bin/dbus-daemon --fork --print-pid 4 --print-address 6 --session
    1  2358  2289  2289 ?           -1 Sl    1000   0:01 /usr/libexec/gvfsd

Der Auszug aus Wikipedia kann auch etwas Licht in die Dinge bringen, lässt aber auch ein wenig vage, wie man tatsächlich feststellt, ob ein Prozess ein Dämon ist oder nicht.

Auszug aus Wikipedia

In einer Unix-Umgebung ist der übergeordnete Prozess eines Daemons häufig, aber nicht immer, der Init-Prozess. Ein Daemon wird normalerweise entweder durch einen Prozess erstellt, der einen untergeordneten Prozess verzweigt und dann sofort beendet, wodurch init den untergeordneten Prozess übernimmt, oder durch den init-Prozess, der den Daemon direkt startet. Darüber hinaus muss ein Daemon, der durch Forken und Beenden gestartet wird, normalerweise andere Vorgänge ausführen, z. B. das Trennen des Prozesses von einem steuernden Terminal (tty). Solche Prozeduren werden häufig in verschiedenen Komfortroutinen wie Daemon (3) in Unix implementiert.

HINWEIS: Auf Systemen, die SystemD verwenden (Red Hat-Distributionen wie Fedora), gibt es normalerweise keinen initProzess, sondern Folgendes :

$ ps -j -1
  PID  PGID   SID TTY      STAT   TIME COMMAND
    1     1     1 ?        Ss     0:42 /usr/lib/systemd/systemd --switched-root --system --deserialize 20

Das ist der Prozess mit der PID 1.

Auf Debian / Ubuntu-Systemen haben sie noch einen Prozess mit dem Namen init:

$ ps -j -1
  PID  PGID   SID TTY      STAT   TIME COMMAND
    1     1     1 ?        Ss     0:02 /sbin/init

Was ist ein Daemon?

Und hier ist der Grund, warum es schwierig sein kann festzustellen, ob etwas ein Daemon ist oder nicht, wenn seine PPID 1 ist:

Ein Prozess kann ein Kind des Init - Prozesses wird, ( Hinweis: das initVerfahren ist PID 1), wenn ihre Eltern wird sie getötet oder Ablehnungen sind diese Verfahren nicht notwendigerweise Daemons, sondern zeigen sich nach wie vor als mit ihrer PPID gleich 1 .

Um festzustellen, ob es sich bei einem Daemon um einen Daemon handelt oder nicht, ist wahrscheinlich eine Reihe von Tests erforderlich, und es muss nicht nur geprüft werden, ob die PPID 1 ist.

Wo bleibt uns das?

Um festzustellen, ob es sich bei einem Daemon um einen Daemon handelt, müssen Sie wahrscheinlich auf verschiedene Tests zurückgreifen, z.

  • PPID 1?
  • Hat TTY angehängt?
  • Ist es ein Service? sudo service ...?
  • Wird es von Systemd, Upstart oder SysV verwaltet?
  • Hört es auf einem Port?
  • Schreibt es in eine Protokolldatei? Syslog?

Wir müssen also auf "Ententippen" zurückgreifen, wenn es quakt und schwimmt. Es ist wahrscheinlich eine Ente, aber selbst die oben genannten Eigenschaften können Sie täuschen.

Verweise

slm
quelle
Wie Sie zitiert haben: "Darüber hinaus muss ein Dämon, der durch Forken und Beenden gestartet wird, normalerweise andere Vorgänge ausführen, z. B. das Trennen des Prozesses von einem steuernden Terminal (tty)." Ich würde Fehlen einer kontrollierenden TTY in meinen Suchkriterien umfassen, wie zB eine ssh - Sitzung neubeeltert wird init , wenn der sshd neu gestartet wird.
Simon Richter
@ SimonRichter - Guter Punkt. Auch dazu wurde ein Absatz hinzugefügt.
slm
4
Ppid = 1 zu haben ist kein verlässlicher Indikator dafür, ein Daemon zu sein. Viele Prozesse, die keine Dämonen sind, haben ihre Eltern überlebt. Umgekehrt verfügen einige Daemon-Prozesse über ein Überwachungsprogramm oder einen anderen Prozess desselben Daemons wie ihre übergeordneten.
Gilles 'SO - hör auf böse zu sein'
@ Gilles - Ich habe dieses A davon entfernt, so einzigartig zu klingen, dass PPID = 1 ein guter Indikator dafür ist, ein Daemon zu sein. LMK was du denkst.
slm
"Alles mit der PPID von 1 ist größtenteils wahrscheinlich ein Dämon" ist grundsätzlich falsch. Zum Beispiel verdoppelt sich meine Fenstermanager-Konfiguration beim Starten von Programmen in der Regel, sodass ich viele X-Anwendungen habe, deren PPID 1 ist. Die Umkehrung funktioniert auf meinem Computer tatsächlich besser, aber das liegt daran, dass es sich um einen Desktop-Computer handelt, der normalerweise nicht ausgeführt wird Überwachte Daemon-Prozesse - Auf einem Server-Computer finden Sie wahrscheinlich viele Daemons, deren PPID ein Supervisor-Prozess ist.
Gilles 'SO - hör auf böse zu sein'
6

Es gibt keine Möglichkeit, einen regulären Prozess von einem Daemon-Prozess zu unterscheiden. Ein Daemon kann von überall gestartet werden, nicht nur von init. Es ist nicht erforderlich, die Verzweigung zu verdoppeln und vom Terminal zu trennen, um als Daemon betrachtet zu werden.

Auf GNOME-Systemen behält der gnome-settings-daemon sein übergeordnetes Element bei, meldet sich beim übergeordneten Terminal an und hat nicht die PID1 als übergeordnete PID, wird jedoch weiterhin als Daemon betrachtet.

Ein Daemon ist einfach ein kontinuierlich laufender Prozess. Sie können sich daher nicht mit einem Befehl identifizieren.

Wenn Sie nun wissen möchten, ob Ihr bestimmter Daemon ausgeführt wird, können Sie den pgrepBefehl genauer betrachten .

Ändern Sie auch den Namen Ihres Daemons. Es gibt bereits einen Befehl namens Daemon, mit dem Sie möglicherweise in Konflikt geraten.

CameronNemo
quelle
Ja. Ich dachte, dass die PID des Daemons nicht immer eine ist, da sie beim Schreiben meines ersten Daemons nicht an den PID 1-Prozess angehängt war. Vielen Dank.
Pranjal
3
Kein angehängtes TTY sollte als stark korreliert (wahrscheinlich viel größer als PPID 1) mit einem Daemon angesehen werden.
Vaab
Ja, aber nein, an jeden Prozess kann kein Terminal angeschlossen sein (z. B. Cron-Jobs).
CameronNemo