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 WikipediaIn 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 init
Prozess, 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 init
Prozess 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 pgrep
Befehl.
Ändern Sie außerdem den Namen Ihres Daemons. Es gibt bereits einen Befehl namens „Daemon“, mit dem es eventuell zu Konflikten kommen kann.