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