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

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

Ich habe einen kleinen Daemon geschrieben, der beim Booten gestartet wird und alle Dinge perfekt erledigt, z. B. 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 anzeigt. Gibt es dafür einen Shell-Befehl?

bearbeiten: Ich verwende Ubuntu 14.04 LTS

Antwort1

Alles mit der PPID 1 ist in den meisten Fällen ein Daemon. Es können jedoch Situationen auftreten, in denen Prozesse zu untergeordneten Elementen von 1 werden können, die technisch gesehen keine Daemons sind. Die Methoden, die ich unten bespreche, sollen also zeigen, wie Sie feststellen können, ob eine PID 1 gehört, 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 ebenfalls etwas Licht in die Sache bringen, aber auch hier bleibt die Frage, wie man tatsächlich feststellt, ob ein Prozess ein Daemon ist oder nicht, etwas unklar.

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 dadurch erstellt, dass ein Prozess einen untergeordneten Prozess aufspaltet und dann sofort beendet, wodurch Init den untergeordneten Prozess übernimmt, oder dadurch, dass der Init-Prozess den Daemon direkt startet. Darüber hinaus muss ein Daemon, der durch Aufspalten und Beenden gestartet wird, normalerweise andere Vorgänge ausführen, z. B. den Prozess von jedem Steuerterminal (tty) trennen. Solche Verfahren werden häufig in verschiedenen praktischen Routinen wie daemon(3) in Unix implementiert.

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

$ 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

So ist der Ablauf beim PID 1.

Auf Debian/Ubuntu-Systemen gibt es immer 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

Also, was ist ein Daemon?

Und aus diesem Grund kann es schwierig sein, zu bestimmen, ob etwas ein Daemon ist oder nicht, wenn seine PPID 1 ist:

Ein Prozess kann ein untergeordneter Prozess des Init-Prozesses werden (NOTIZ:dieser initProzess hat die PID 1), wenn ihr übergeordneter Prozess beendet wird oder sie verleugnet, sind diese Prozesse nicht unbedingt Daemons, werden aber trotzdem mit der PPID 1 angezeigt.

Um also festzustellen, ob es sich bei etwas um einen Daemon handelt oder nicht, ist wahrscheinlich eine Reihe von Tests erforderlich. Es reicht nicht aus, einfach nachzuschauen, ob die PPID 1 ist.

Wo stehen wir also?

Um zu bestimmen, ob es sich bei etwas um einen Daemon handelt, müssen Sie wahrscheinlich auf eine Reihe von Tests zurückgreifen, beispielsweise:

  • PPID 1?
  • Ist TTY angeschlossen?
  • Ist es ein Dienst sudo service ...??
  • Wird es von Systemd, Upstart oder SysV verwaltet?
  • Lauscht es an einem Port?
  • Wird in eine Protokolldatei geschrieben? Syslog?

Wir müssen also auf „Ententypisierung“ zurückgreifen. Wenn es quakt und schwimmt, ist es wahrscheinlich eine Ente, aber selbst die oben genannten Merkmale können einen täuschen.

Verweise

Antwort2

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 notwendig, doppelt zu forken und sich vom Terminal zu trennen, um als Daemon zu gelten.

Auf GNOME-Systemen behält der Gnome-Settings-Daemon seinen übergeordneten Daemon bei, meldet sich beim Terminal des übergeordneten Daemons an und hat nicht PID1 als übergeordnete PID, wird aber dennoch als Daemon betrachtet.

Ein Daemon ist einfach ein kontinuierlich laufender Prozess. Er kann daher nicht mit einem einzigen Befehl identifiziert werden.

Wenn Sie nun wissen möchten, ob Ihr bestimmter Daemon ausgeführt wird, werfen Sie einen Blick auf den pgrepBefehl.

Ändern Sie außerdem den Namen Ihres Daemons. Es gibt bereits einen Befehl namens „Daemon“, mit dem es eventuell zu Konflikten kommen kann.

verwandte Informationen