プロセスがデーモンであるかどうかを確認する方法は?

プロセスがデーモンであるかどうかを確認する方法は?

私は起動時に起動し、ログファイルに書き込むなど、すべての作業を完全に実行する小さなデーモンを作成しました。しかし、プロセスがデーモンであるかどうかを確認する方法を知りたいです。教授が私に命令 ps -xj | grep daemon(私のファイル名はdaemon)を言われましたが、望ましくない情報が表示されるのでよくわかりません。関連するシェルコマンドはありますか?

編集:Ubuntu 14.04 LTSを使用しています。

答え1

ほとんどの場合、PPIDが1のすべてのエントリはデーモンである可能性が高いです。しかし、場合によっては、プロセスは 1 の子プロセスになる可能性があり、これらのプロセスは技術的にデーモンではありません。したがって、以下で説明する方法は、PIDが必ず実際のデーモンではなく1に属しているかどうかを確認する方法を示しています。

例えば

$ 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

ウィキペディアからの抜粋も物事についてある程度明らかにすることができますが、プロセスがデーモンであるかどうかを実際に決定する方法については少しあいまいです。

ウィキペディアから抜粋

Unix環境では、デーモンの親プロセスは通常initプロセスですが、必ずしもそうではありません。デーモンは通常、プロセスによって生成されたサブプロセスであり、すぐに終了し、initにサブプロセスを採用させるか、デーモンプロセスがinitプロセスによって直接開始されます。さらに、ブランチとシャットダウンから始まるデーモンは通常、制御端末(tty)からプロセスを分離するなどの追加の作業を実行する必要があります。これらの手順は通常、Unixのdaemon(3)などのさまざまな便利なルーチンで実装されています。

メモ:SystemD(FedoraなどのRed Hatディストリビューション)を使用するシステムには通常プロセスはありませんが、init次のようになります。

$ 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

これがPID 1のプロセスです。

Debian/Ubuntu システムには次のようなプロセスがありますinit

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

それでは、デーモンとは何ですか?

PPIDが1のときにデーモンかどうかを判断するのが難しい理由は次のとおりです。

プロセスはinitプロセスの子プロセスにすることができます(メモ:プロセスinitのPIDは1です。親プロセスが終了または分離されている場合、これらのプロセスは必ずしもデーモンである必要はありませんが、PPIDは1としてマークされます。

したがって、何かがデーモンであることを確認するには、PPIDが1であることを確認することに加えて、一連のテストを実行する必要があるかもしれません。

それでは私たちはどうなりますか?

何かがデーモンであることを確認するには、次のようなさまざまなテストを実行する必要があります。

  • PPID 1?
  • TTYが接続されていますか?
  • これはサービスですか?sudo service ...
  • Systemd、Upstart、またはSysVで管理されていますか?
  • ポートでリッスンしていますか?
  • ログファイルに書き込まれますか?システムログ?

したがって、私たちは「アヒルタイピング」に頼らなければなりません。もしそれがうんざりして泳ぐなら、おそらくアヒルでしょう。しかし、上記の特性でさえあなたをだますことができます。

引用する

答え2

通常のプロセスとデーモンプロセスを区別する方法はありません。デーモンはinitだけでなくどこでも起動できます。デーモンと見なされるために、端末で2回フォークして分離する必要はありません。

GNOMEシステムでは、gnome-settings-daemonは親プロセスを維持し、親プロセスの端末にログインし、PID1を親プロセスPIDとして持っていませんが、まだデーモンと見なされます。

デーモンは継続的に実行されるプロセスです。したがって、単一のコマンドで識別できません。

特定のデーモンが実行されているかどうかを知りたい場合は、このpgrepコマンドを確認してください。

また、デーモンの名前を変更すると、すでにdaemonというコマンドがあり、それと競合する可能性があります。

関連情報