私は起動時に起動し、ログファイルに書き込むなど、すべての作業を完全に実行する小さなデーモンを作成しました。しかし、プロセスがデーモンであるかどうかを確認する方法を知りたいです。教授が私に命令
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というコマンドがあり、それと競合する可能性があります。