サービスとデーモン

終わらないプログラムがある

これまで打ってきたコマンドは、仕事を終えると消えました。ls は一覧を出して終わり、cp は写して終わりです。ところが nginx は違います。起動してから、こちらが止めるまでずっと居続けます。

こういう「常駐して待ち続けるプログラム」をデーモンと呼びます。Webサーバー、データベース、SSHの接続を受ける口。サーバーの仕事はほとんどがデーモンです。そしてデーモンをまとめて面倒みる仕組みが systemd で、systemd から見た1つ1つの単位をサービスと呼びます。

名前が3つ出てきましたが、指しているものは近いところにあります。動いている実体がデーモン、systemd が管理する登録名がサービス、と押さえておけば十分です。

動いている実体を見る

ps は、いま動いているプロセスの一覧を出します。

ps aux | grep nginx

aux は「自分以外のユーザーのものも含めて、全部を詳しく」という指定です。出力はこうなります。

root 1234 0.0 0.1 55180 1400 ? Ss 12:01 0:00 nginx: master process /usr/sbin/nginx www-data 1235 0.0 0.2 55568 2600 ? S 12:01 0:00 nginx: worker process

2行あることに気づいてください。nginx は1つのプログラムに見えて、役割の違う2種類のプロセスで動いています。

親と子で分かれている理由

master process は取りまとめ役です。設定を読み、ポートを確保し、worker を産みます。実際にリクエストを受けて返しているのは worker process のほうです。

分けてあるのには理由があります。ポート 80 を確保するには管理者の権限が要りますが、外から来たリクエストを直接さばくプロセスに強い権限を持たせるのは危険です。そこで、権限の要る仕事だけを master が root で先に済ませ、worker は www-data という力の弱いユーザーに落として動かします。上の出力の1列目が、まさにそれを示しています。

この「必要な権限だけを渡す」という考え方は4章でもう一度、自分の手で実践します。

プロセスには番号が付く

2列目の数字がプロセスID (PID) です。プロセスを名指しするときの番号で、止めたり様子を見たりするのに使います。

systemd に聞けば、そのサービスの代表となる PID を直接教えてくれます。

systemctl show -p MainPID --value nginx # 1234

ps で見えた master の番号と一致するはずです。systemd が管理しているサービスと、目の前で動いているプロセスが、同じものを指していることをここで確かめておきます。

手を動かす

nginx のプロセスを ps で観察してファイルに残し、systemd の言う代表 PID と突き合わせます。

ヒント

  • 1. systemctl start nginx で動いている状態にしておく
  • 2. ps aux | grep nginx で master と worker の行を確かめる
  • 3. その出力を /root/nginx-procs.txt に保存する
  • 4. systemctl show -p MainPID --value nginx の結果を /root/nginx-pid.txt に保存する

4 項目で採点します