プロセスとデーモンの違い

Linux

いざ、プロセスとデーモンの違いとか、調べてもなかなかに初心者向けな記事が無かった。
今更ですが両者の違いに関する理解が不明瞭だったので、調べてみました。

まずはじめに、Linuxではpsコマンドを使ってプロセスを確認することができます。

# ps a
  PID TTY      STAT   TIME COMMAND
 4555 tty1     Ss+    0:00 /sbin/agetty --noclear tty1 linux
 4556 ttyS0    Ss+    0:00 /sbin/agetty --keep-baud 115200,38400,9600 ttyS0 vt220
13930 pts/0    Ss     0:00 -bash
13955 pts/0    S      0:00 sudo -s
13956 pts/0    S      0:00 /bin/bash
14484 pts/0    R+     0:00 ps a

ここで理解をしておく必要がある単語はTTYに表示される内容
TTYには対象のプロセスの標準出力となっている端末デバイスが表示される。
tty1、ttyS0、ptsはどれもTTYの種別の1つとなっている。

項目内容
tty1デフォルトの仮想コンソール
ttyS0シリアルケーブルで繋いだ際のコンソール
ptsSSH等でアクセスした際のコンソール

これらは入出力を受け付ける端末が存在するプロセスとなる。

次に、psコマンドにxオプションをつけて実行をしてみる。
すると、TTYが?のプロセスが大量に出力される。

# ps x
  PID TTY      STAT   TIME COMMAND
    1 ?        Ss     0:54 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
    2 ?        S      0:00 [kthreadd]
    4 ?        I<     0:00 [kworker/0:0H]
    6 ?        I<     0:00 [mm_percpu_wq]
    7 ?        S      0:10 [ksoftirqd/0]
    8 ?        I      0:25 [rcu_sched]
    9 ?        I      0:00 [rcu_bh]
   10 ?        S      0:00 [migration/0]
   11 ?        S      0:10 [watchdog/0]
   12 ?        S      0:00 [cpuhp/0]
   14 ?        S      0:00 [kdevtmpfs]
   15 ?        I<     0:00 [netns]
   16 ?        I      0:12 [kworker/u30:1]
   21 ?        S      0:00 [xenbus]
(省略)
13955 pts/0    S      0:00 sudo -s
13956 pts/0    S      0:00 /bin/bash
14485 ?        I      0:00 [kworker/0:0]
14520 ?        I      0:00 [kworker/0:2]
14561 ?        I      0:00 [kworker/0:1]
14617 pts/0    R+     0:00 ps x
24123 ?        I      0:02 [kworker/u30:0]

TTYが?となっているプロセスがデーモンプロセスとなる。

デーモンはOS起動時にsystemd、init(古い)などによって起動されます。
起動されるデーモンについてはsystemctlコマンドで確認することができます。

# systemctl list-unit-files
UNIT FILE                                     STATE
proc-sys-fs-binfmt_misc.automount             static
dev-hugepages.mount                           static
dev-mqueue.mount                              static
proc-fs-nfsd.mount                            static
proc-sys-fs-binfmt_misc.mount                 static
sys-fs-fuse-connections.mount                 static
sys-kernel-config.mount                       static
sys-kernel-debug.mount                        static
tmp.mount                                     disabled
var-lib-nfs-rpc_pipefs.mount                  static
brandbot.path                                 enabled
systemd-ask-password-console.path             static
systemd-ask-password-plymouth.path            static
systemd-ask-password-wall.path                static
session-8095.scope                            static
acpid.service                                 enabled
amazon-ssm-agent.service                      enabled
amzn2-early-relabel-modules.service           enabled
arp-ethers.service                            disabled
atd.service                                   enabled
auditd.service                                enabled
auth-rpcgss-module.service                    static
autovt@.service                               enabled

では次に、プロセスのフォアグラウンド、バックグラウンド実行について考えます。

まずはテスト用にスリープするだけのスクリプト「test.sh」を準備します。

while true
do
sleep 1
done

この子を実行すると、裏側でsleepを繰り返すので、応答が返ってこずに固まります。
現在、フォアグラウンドで稼働しているので、止めるにはCtrl+Cでとめます。

# ./test.sh
(応答が返ってこない)

デーモンはバックグラウンドで動いています。
プロセスも&をつけることで同様にバックグラウンドで動かすことができます。
psコマンドで確認すると、プロセスとして稼働していることがわかります。

# ./test.sh &
[1] 14775
[root@ip-172-31-38-173 ec2-user]# ps
  PID TTY          TIME CMD
13955 pts/0    00:00:00 sudo
13956 pts/0    00:00:00 bash
14775 pts/0    00:00:00 bash
14777 pts/0    00:00:00 sleep
14778 pts/0    00:00:00 ps

このプロセスをフォアグラウンドに持ってくるにはfgコマンドを使います。
フォアグラウンドに持ってくると応答が止まった状態となるので、Ctrl+Cで抜けます。

# fg
./test.sh
^C
#

では、ここでプロセスのバックグラウンド実行とデーモンの違いは何かというと制御端末の有無があげられます。
プロセスをバックグラウンドで動かした状態でコンソールをログオフすると、バックグラウンドプロセスも同時に停止します。(停止しないようにnohupコマンドとかもありますが今回は割愛)

じゃあ、制御端末に依存せず、systemdから起動させるようにしたバックグラウンドプロセスならデーモン足りうるかというと、おおむねあっています。(と思ってます。)

systemdのユニットファイルを作成することで、そのことが実現できます。

10.6. systemd のユニットファイルの作成および変更 Red Hat Enterprise Linux 7 | Red Hat Customer Portal
The Red Hat Customer Portal delivers the knowledge, expertise, and guidance available through your Red Hat subscription.

結論。

デーモンプロセスはプロセスの1種。
大きな違いは制御端末の有無と起動がsystemdからかどうかという点。

コメント

タイトルとURLをコピーしました