【初心者向け】Linuxにおけるデーモンを理解しよう

この記事を開いていただきありがとうございます。ルートです。

Linuxを構成する要素の中で、特に重要なものの一つにデーモンという概念があります。よく使われているデーモンの例としては httpd や sshd がありますが、これらがLinuxというシステムの中でどういう風に扱われているかというのを今回は解説したいと思います。

この記事で学べる内容
  • デーモンの概要
  • デーモン(サービス)の操作の仕方
  • 実務でデーモン(サービス)を触るうえで気をつけるべきこと

デーモンの概要

デーモンとは、一言でいうと「常駐して裏で動き続けるプロセス」です。
通常のプロセスは、実行されて処理が終わると終了します。しかし、それだけではサーバとしてサービスを提供し続けることはできません。

例えば、いつ来るかわからないリクエストを待ち受けたり、サーバが再起動されても自動でサービスを提供するプロセスを起動したりする必要があります。そのような役割を担うのがデーモンです。

より身近な具体例として、Webサーバがあります。Apacheであったりnginx といった製品がよく使われますが、これらのデーモンが常時動き続けることによって、24時間365日いつアクセスしてもコンテンツを提供してくれています。

他にも、よく使われるデーモンとしては以下があります。

sshdSSH接続をできるように待ち受けるデーモン。
mysqldデータベースのMySQLに関するデーモン。ユーザからの問い合わせに対して対応する。
crondcronとしての対応を実施するデーモン。ユーザが指定したcronに関する設定を実行する。

ちなみに、なぜ裏で動き続けるプロセスのことを「デーモン」と呼ぶかについては、以下の記事に詳細が記載されてました。

UNIX/Linuxでよく使われる「Daemon」(デーモン)プロセスの語源とは?


この記事を書きながら自分も初めて知ったのですが、MACプロジェクトの創立メンバーの一人であるフェルナンド・J・コルバト氏が、物理学の間で有名な「マクスウェルの悪魔」になぞらえてデーモンと呼ぶようになったようです。

デーモンの管理方法

この節では、デーモンの管理方法について解説したいと思います。

現在のLinuxでは、systemd によって管理されています。これによって、デーモンの起動・停止・再起動・自動起動の動作を管理しています。

ここで注意が必要なのが、systemd ではservice unit とよばれる単位でデーモンを管理しているので、デーモンのことをサービスとよびます。ただ、実際には同じものであり、概念や説明のときに使われる用語が「デーモン」、実際に管理する対象やコマンドを用いるときは「サービス」という使われ方をするということだけ覚えていればOKです。

systemdについて詳しく説明しようとすると、かなり長くなり本記事の方向性とずれるので、ここでは上記のような形での説明に留めます。今後、systemd に関する記事も投稿しようと思うので、より詳しく知りたい方はお待ちいただければ幸いです。

次に実際に管理するコマンドをみていきます。基本的には、以下の 4 つをを覚えておけばOKです。

  • サービスの起動
Bash
systemctl start ${サービス名}
  • サービスの停止
Bash
systemctl stop ${サービス名}
  • サービスの再起動
Bash
systemctl restart ${サービス名}
  • サービスの状態確認
Bash
systemctl status ${サービス名}

実際の動作に関係するのが最初の3つで、最後の状態確認についてはその名の通りサービスの状態を確認するときに使います。主に、不具合があった場合や正常にサービスが起動しない場合などに確認して、原因を調べるために使います。

実際にデーモンの動作を管理してみる

それでは、実際にsystemdを用いてデーモンの動作を管理してみましょう。ここでは、以下のDockerfileによってデプロイされるコンテナを用いていろいろコマンドを実行してみます。

Dockerfile
FROM almalinux:latest

RUN dnf -y update \
&& dnf install -y openssh-server httpd procps-ng sudo

RUN ssh-keygen -A

RUN useradd test-user\
&& echo 'test-user:hogefuga' | chpasswd \
&& usermod -aG wheel test-user

CMD ["/usr/sbin/sshd", "-D"]

まず、今回はコンテナ内でsystemctlコマンドを使いたいため、デプロイした後は以下のコマンドでコンテナを起動します(今回はデプロイしたイメージ名をalmalinux-test、作成するコンテナ名をdaemon_testとしています)

Bash
docker run -d --privileged --name daemon_test -p 2222:22 almalinux-test /sbin/init

コマンド実行後、次のような表示が出ればOKです。

Bash
$ docker run -d --privileged --name daemon_test -p 2222:22 almalinux-test /sbin/init
6a04f5bb1ff28147cc08c5a22a41a9cde86da3dc62976ea8b32bb899c36b05b1

コンテナが起動できたら、SSH接続します。まず、apacheの状態を確認してみましょう。次のコマンドを実行してください。

Bash
systemctl status httpd.service

上記コマンドを実行すると、httpd.serviceの現在のステータスが表示されます。コンテナを立ち上げてすぐこのコマンドを実行すると、次のような表示がされるはずです。

Bash
$ systemctl status httpd.service
 httpd.service - The Apache HTTP Server
     Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; preset: disabled)
     Active: inactive (dead)
       Docs: man:httpd.service(8)

状態としては、Active: inactive (dead)なので起動していない状態です。。念の為、psコマンドでもプロセスがないか確認してみます。

Bash
$ ps auxww | grep [h]ttpd
$

プロセスもないことも分かりました。それでは次のコマンドでapacheを起動してみます。

Bash
sudo systemctl start httpd.srevice

このコマンドを実行すると以下のような表示がされるので、test-userのパスワードを入力しましょう。プロンプトが返ってきたら起動に成功しています。

Bash
[test-user@6a04f5bb1ff2 ~]$ sudo systemctl start httpd.service

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

[sudo] password for test-user:
$

念の為、ステータスと ps コマンドで起動しているか確認しましょう。

  • httpd.serviceのステータス
Bash
$ systemctl status httpd.service
 httpd.service - The Apache HTTP Server
     Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; preset: disabled)
     Active: active (running) since Wed 2026-01-07 06:07:02 UTC; 9s ago
       Docs: man:httpd.service(8)
   Main PID: 81 (httpd)
     Status: "Total requests: 0; Idle/Busy workers 100/0;Requests/sec: 0; Bytes served/sec:   0 B/sec"
      Tasks: 177 (limit: 49509)
     Memory: 13.3M
        CPU: 89ms
     CGroup: /system.slice/httpd.service
             ├─81 /usr/sbin/httpd -DFOREGROUND
             ├─82 /usr/sbin/httpd -DFOREGROUND
             ├─83 /usr/sbin/httpd -DFOREGROUND
             ├─84 /usr/sbin/httpd -DFOREGROUND
             └─85 /usr/sbin/httpd -DFOREGROUND
  • psコマンドの結果
Bash
$ ps auxww | grep [h]ttpd
root          81  0.0  0.1  29864 10728 ?        Ss   12:54   0:00 /usr/sbin/httpd -DFOREGROUND
apache        82  0.0  0.1  31848  8940 ?        S    12:54   0:00 /usr/sbin/httpd -DFOREGROUND
apache        83  0.0  0.1 2371732 10060 ?       Sl   12:54   0:01 /usr/sbin/httpd -DFOREGROUND
apache        84  0.0  0.1 2174100 10056 ?       Sl   12:54   0:01 /usr/sbin/httpd -DFOREGROUND
apache        85  0.0  0.1 2174100 10052 ?       Sl   12:54   0:01 /usr/sbin/httpd -DFOREGROUND

さっきとは打って変わって、Active: active (running)となっており、psコマンドでもhttpdプロセスが立ち上がっていることが分かりますね。

それでは次に、HTMLファイルを用意してcurlコマンドで応答が返ってくるか確認しましょう。 /var/www/html配下に次のファイルを置いてください。ファイル名は index.htmlとしておきましょう。

HTML
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>Apache Test</title>
</head>
<body>
  <h1>Apache テスト</h1>
</body>
</html>

lsコマンドの結果が次のようになっていればOKです。

Bash
$ ls -l /var/www/html/
total 4
-rw-r--r-- 1 root root 153 Jan  7 14:05 index.html

それではcurlコマンドで応答を確認してみます。さっき配置したHTMLファイルの中身が返ってくるはずです。

Bash
$ curl http://localhost
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>Apache Test</title>
</head>
<body>
  <h1>Apache テスト</h1>
</body>
</html>

ちゃんと配置したindex.htmlの中身が返ってきました。一応これでコンテンツは配信できる状態にはなっていることが分かりました。

それでは最後に、apacheを停止させましょう。次のコマンドを実行してみてください。

Bash
sudo systemctl stop httpd.service

start と同じくプロンプトが返ってくればOKです。ステータスとpsコマンドでも確認してみましょう。

Bash
[test-user@7945c7856b05 html]$ systemctl status httpd.service
 httpd.service - The Apache HTTP Server
     Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; preset: disabled)
     Active: inactive (dead)
       Docs: man:httpd.service(8)

[test-user@7945c7856b05 html]$ ps auxww | grep [h]ttpd
[test-user@7945c7856b05 html]$

ステータスがActive: inactive (dead)でプロセスも存在しないため、正常に停止していることが分かりました。

設定ファイルを編集したときのデーモンの動き

ここでは、デーモン(サービス)の設定ファイルを変更した場合、その変更がいつ反映されるのかを確認します。例えば、Apacheの設定を変更したとき、その内容はいつ反映されるのでしょうか。

結論から言うと、多くの場合、サービスを再起動したときに設定変更が反映されます。
それでは、これまで使ってきたコンテナ内のApacheの設定を実際に変更し、どのタイミングで変更が反映されるのかを確認してみましょう。

Apacheのデフォルト設定では、80番ポートで通信を待ち受けてますが、これを8080番ポートに変更してみます。

まず、以下のコマンドで /etc/httpd/conf/httpd.conf をバックアップします。

Bash
sudo cp -p /etc/httpd/conf/httpd.conf{,.org}

念の為、バックアップが存在するか確認しておきましょう。

Bash
$ ls -l /etc/httpd/conf/httpd.conf{,.org}
-rw-r--r-- 1 root root 12005 Jan  7 14:10 /etc/httpd/conf/httpd.conf
-rw-r--r-- 1 root root 12005 Dec 22 22:33 /etc/httpd/conf/httpd.conf.org

次に、httpd.conf を以下のように変更して保存します。

Bash
Listen 80

Listen 8080

念の為設定ファイルの文法が間違ってないか以下のコマンドでチェックをしておきます。

Bash
apachectl -t

これを実行すると、以下のように「Syntax OK」が表示されるはずです(一番上のエラーはサーバのホスト名とドメイン名が違う場合に表示されるもので、今回は無視してOKです。)

Bash
$ apachectl -t
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using *****. Set the 'ServerName' directive globally to suppress this message
Syntax OK

最後に、diffをとって想定通りの差分しか出なければOKです。

Bash
$ diff -U0 /etc/httpd/conf/httpd.conf{.org,}
--- /etc/httpd/conf/httpd.conf.org	2025-12-22 22:33:29.000000000 +0000
+++ /etc/httpd/conf/httpd.conf	2026-01-11 13:39:43.330523008 +0000
@@ -47 +47 @@
-Listen 80
+Listen 8080

それでは、この状態で以下のcurlコマンドを実行してみましょう。もしこの時点でhttpd.confが読み込まれているなら応答があるはずです。

Bash
curl http://localhost:8080

ただ、実際は以下のようにConnection refusedというエラーが返ってきます。

Bash
$ curl http://localhost:8080
curl: (7) Failed to connect to localhost port 8080: Connection refused

それでは、httpd.serviceを再起動して再度curlコマンドを実行してみましょう。サービスの再起動は以下のコマンドで行います。

Bash
sudo systemctl restart httpd.service

実行して再度curlコマンドを実行した結果が以下です。事前に用意しておいたHTMLファイルが見れています。

Bash
$ sudo systemctl restart httpd.service
$ curl http://localhost:8080
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>Apache Test</title>
</head>
<body>
  <h1>Apache テスト</h1>
</body>
</html>

以上で、サービスを再起動したタイミングで新しい設定ファイルが読み込まれていることが分かりました。

最後に、今回使ったコンテナを削除しておきましょう。以下のコマンドを実行することでコンテナが削除されます。

Bash
docker rm -f ${コンテナID}

実務でデーモン(サービス)を触るときの心得

最後に、実務においてデーモン(サービス)を触るときに気をつけておくべきポイントを、自分の経験に基づいてまとめます。

  • 起動、停止をする際は必ず該当サービスの状態を確認する
    • 停止していたものを起動する、あるいは起動していたものを停止するということがコンソールログに残るように、作業を行う前にサービスの状態を確認するようにしておくと、後から証跡を求められたときに対応することができます。また、プロセス単位でも起動もしくは停止しているのかを確認するために、psコマンドを実行しておきましょう。
  • 設定変更をする前は、必ずバックアップを取得する
    • サービスの設定ファイルの編集にかかわらず、設定ファイルを編集する際は必ずバックアップを取得しましょう。設定ファイルの編集が終わった後は、想定通りの箇所しか編集が行われていないことの確認も必ず行いましょう。
  • ある場合は文法チェックコマンドを実行する
    • すべてのサービスにあるわけではないですが、ある場合は文法チェックコマンドを実行しましょう。これにより、少なくとも文法上間違っているかどうかのチェックができ、誤った設定ファイルの状態でサービスの起動・再起動をするリスクが減ります。
      apacheの場合だと、apachectl -t で文法チェックができます。

上記は普段自分が確認事項として行っていることですが、本番環境での作業をするときは最低限これだけのことを実行しておくと安心かと思います。

まとめ

今回はデーモン(サービス)の概要や実務で触るうえで気をつけるべきポイントなどをまとめました。インフラエンジニアをやっていくうえで、サービスの停止・起動・再起動などは日常的に行う作業なので、今回の記事が皆様のお役に立てれば幸いです。

それではここまで読んでいただきありがとうございました!

今回の内容
  • デーモンは常駐プロセスのこと
  • デーモン(サービス)を操作する際は以下のコマンドを用いる。
    • サービスの起動
      • systemctl start ${サービス名}
    • サービスの停止
      • systemctl stop ${サービス名}
    • サービスの再起動
      • systemctl restart ${サービス名}
    • サービスの状態確認
      • systemctl status ${サービス名}
  • デーモン(サービス)の設定ファイルを変更した際は、再起動をする際に変更が反映される。