プロセスがデーモンかどうかを確認するにはどうすればよいでしょうか?

プロセスがデーモンかどうかを確認するにはどうすればよいでしょうか?

ブート時に起動し、ログ ファイルに書き込むなどのすべての処理を完璧に実行する小さなデーモンを作成しました。しかし、そのプロセスがデーモンであるかどうかをどのように確認できるかを知りたいです。教授からコマンドについて教えてもらいました 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

Wikipedia からの抜粋も、ある程度は理解を深めるのに役立ちますが、プロセスがデーモンであるかどうかを実際に判断する方法については、やはり少し曖昧なままです。

Wikipediaからの抜粋

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 かどうかを確認するだけでなく、一連のテストが必要になる可能性があります。

それで、私たちはどうなるのでしょうか?

何かがデーモンであるかどうかを判断するには、次のようなさまざまなテストに頼る必要があるでしょう。

  • PPID1?
  • TTYは接続されていますか?
  • サービスですかsudo service ...??
  • Systemd、Upstart、SysV によって管理されていますか?
  • ポートをリッスンしていますか?
  • ログファイルに書き込んでいますか?Syslog ですか?

そのため、私たちは「ダックタイピング」に頼らざるを得ません。もしそれがクワクワと鳴き、泳ぐなら、それはおそらくアヒルですが、上記の特徴でさえあなたを騙す可能性があります。

参考文献

答え2

通常のプロセスとデーモン プロセスを区別する方法はありません。デーモンは init だけでなく、どこからでも起動できます。デーモンと見なされるために、ダブル フォークしてターミナルからデタッチする必要はありません。

GNOME システムでは、gnome-settings-daemon は親を保持し、親の端末にログを記録し、親 PID として PID1 を持ちませんが、それでもデーモンと見なされます。

デーモンは単に継続的に実行されるプロセスです。したがって、1 つのコマンドで識別することは不可能です。

さて、特定のデーモンが実行中かどうかを知りたい場合は、コマンドを見てみましょうpgrep

また、デーモンの名前を変更してください。daemon というコマンドが既に存在しており、最終的に競合する可能性があります。

関連情報