新人エンジニアは「デーモン」がわからない　~ 1. デーモン…ってなんだっけ？~

# はじめに
「そもそもデーモンって何やっけ？」って感じの新人エンジニアである私ですが、ここ最近暇すぎたのでデーモンについて調べてみた結果をまとめてみます。
まずは基本的なところからおさらして、とりあえず超シンプルなデーモンを作って動かすところまで行ってみたいと思います。

# デーモンとは？

簡単に言うと **「バックグラウンドでずっと動いているプログラム」** のことです。

例えば、
- 時間になったら自動でバックアップを取る
- 閾値に達したら警告を出す
- ネットワークに異常がないかずっと見張る

といった処理を人間の代わりに常に待機・自動対応してくれるのがデーモンです。

## デーモンの特徴

|特徴	|内容|
|--------|-----|
|常駐型	|バックグラウンドで起動し続ける|
|ユーザがログインしていなくても動く	|システムが起動したときから動いてることも
|標準出力・標準エラーを使わない	|ログファイルに書き出すのが一般的
|PIDファイルを残す	|自分のプロセスIDをファイルに書いておく（管理のため）

## なぜ「デーモン」と呼ぶの？

Unixの開発者たちが、ギリシャ神話の「daemon（精霊）」から名付けたとされています。
人の目には見えないけど、何かを助けてくれる存在、というイメージですね。

# まずは体験！超シンプルな「擬似デーモン」

ここでは「デーモンっぽい動きをする簡単なシェルスクリプト」を用意してみます。

### スクリプト
logtime.sh
``` bash
#!/bin/bash
# 毎分、現在時刻をログに記録する簡単なスクリプト
LOGFILE="/tmp/mydaemon.log"

while true; do
  echo "$(date): I'm alive!" >> "$LOGFILE"
  sleep 60  # 60秒ごとに実行
done
```

### 実行方法

実行権限を付与：
`chmod +x logtime.sh`

バックグラウンドで起動：
`./logtime.sh &`


これでスクリプトはバックグラウンドで起動し、1分ごとにログを書き続けます。

### 終わらせるには

実行中のプロセスを探して終了します
`ps aux | grep logtime.sh`

出てきた PID を kill コマンドで停止します
`kill 12345`

では次に「本物のデーモン」を作るにはどうすればいいのか、順を追って説明していきます。


# Linuxで「本物のデーモン」として扱われるプログラムを作る！

## 本物のデーモンの定義とは？

「バックグラウンドで動かすだけ」では本物のデーモンとは言いません。

デーモンとして必要な要素：
1. 標準入出力を閉じる（端末と切り離す）
1. 親プロセス（＝ bashシェル）から切り離す（セッションの独立）
1. バックグラウンドで動き続ける
1. PIDファイルを作る（管理しやすくするため）
1. ログ出力をファイルなどに行う

## シンプルな「本物のデーモン」のサンプル（Bash + daemonizeコマンド）

Bashだけで本格的なデーモンを書くのはやや手間ですが、daemonize というツールを使うとすごく簡単です。

### daemozizeコマンドとは

daemonize コマンドは、任意のプログラムをデーモンとして実行するためのユーティリティです。


### 基本的な役割

プログラムをデーモン化するには通常、以下の処理が必要です。

|処理内容	|意味・目的|
|-----------|--------|
|親プロセスからの切り離し	|ターミナルに依存せず動作するため
|標準入出力の切断	|ターミナルと無関係にするため
|カレントディレクトリの変更	|セキュリティや一貫性のために変更するのが一般的
|umaskの設定	|デフォルトのファイルパーミッションの制御
|PIDファイルの作成	|プロセスの識別や管理のため
|ログファイルの指定	|出力内容をファイルに記録するため

これらを 一括でやってくれるのが daemonize コマンド です。

### deamonizeがしてくれる主な処理
- fork() してプロセスをバックグラウンドに移行
    - 端末との関係を断ち、ログイン中の端末の操作をブロックしない
    - サービスとして裏で自動的に実行されるようにするため
- setsid() を使って新しいセッションを作成し、親プロセスから切り離し（セッション独立）
    - 端末と完全に分離される
    - ログアウトやターミナル切断（SIGNUP）で死なない
    - ps でみたときにセッションリーダーではなくなる → 安定性向上
- 標準入手・出力・エラーの切断（/dev/null にリダイレクト）
    - 端末に依存しない設計にするため（ログインが不要になる）
- カレントディレクトリを /（ルート） にする
    - 作業しディレクトリがアンマウントされても問題なく動作するようにするため
- umask を設定し、ファイル・ディレクトリ作成時のパーミッション初期値を制御
    - デフォルトのumaskに依存せず、安全なファイルパーミッションに統一
    - 他のユーザに書き込みを許さないようにする（セキュリティ強化）
- 実行中プロセスのPIDを /var/run/~.pid などに記録
    - 同じサービスが二重起動しないようにする
    - kill などで外部から安全に停止・再起動できるようにする
    - systemd や cron からプロセスを監視・制御しやすくする
- 出力やエラーを特定のログファイルに記録
    - サービスとして長期稼働させるならログは必須（トラブルシュート）


#### 【補足】PIDファイルってなに？

PIDファイルとは、あるプログラムのプロセスID（PID）を記録するためのファイルです。

Linuxでは、実行中の各プロセスに一意の番号（PID）が割り当てられます
たとえば、ps コマンドで現在のプロセスを見ると：

```
$ ps

  PID TTY          TIME CMD
12345 pts/0    00:00:00 bash
12367 pts/0    00:00:00 mydaemon
```

ここで mydaemon の PID は 12367 です。


##### PIDファイルの目的
1. プロセスを識別できるようにする
    たとえば /var/run/mydaemon.pid に 12367 と書かれていたら、そのファイルを見れば mydaemon のプロセスIDが分かる
2. 再起動や停止を簡単にする
    kill コマンドなどでそのPIDを使えば、対象のプロセスに信号を送れる：`kill $(cat /var/run/mydaemon.pid)`
3. 多重起動を防ぐ
    起動時に pidファイルが既に存在するか？ をチェックすれば、同じデーモンを2回以上起動しないようにできます

⸻

##### よく使われる場所
- /var/run/ または /run/ ディレクトリ内に作られるのが一般的（システム用）
- ユーザー用であれば ~/myapp/myapp.pid のように自分のディレクトリに作成してもOK


##### 実例：daemonizeで使う場合

`daemonize -p /var/run/logtime.pid /home/youruser/logtime.sh`

この場合、logtime.sh をデーモン化して、そのプロセスIDを /var/run/logtime.pid に保存します。
補足おしまい！


### 使用例

`daemonize -c / -e /var/log/myprog.err -o /var/log/myprog.out -p /var/run/myprog.pid /usr/bin/myprog`

オプション：
- -c /　：カレントディレクトリを / に変更
- -e　：標準エラー出力を指定ファイルにリダイレクト
- -o　：標準出力を指定ファイルにリダイレクト
- -p　：PIDファイルを指定（プロセスIDを書き出す）
- 最後の引数　：実行したいプログラムのパス


### 補足：使いどころ
- 簡単な監視スクリプトを常駐させたいとき
- Pythonやbashスクリプトをデーモンとして動かしたいとき
- systemd の .service を使わない軽量なデーモン化手段が欲しいとき

では、実際にデーモンを作成していきましょう。

### daemonize をインストール（なければ）

`sudo apt install daemonize`　# Debian/Ubuntu系
`sudo yum install daemonize`　# RHEL/CentOS系


 ### 動かしたいスクリプトを用意

logtime.sh

```bash
#!/bin/bash
# 毎分、現在時刻をログに記録する簡単なスクリプト
LOGFILE="/tmp/logtime_daemon.log"

while true; do
  echo "$(date): Hello from daemon!" >> "$LOGFILE"
  sleep 60
done
```

### このスクリプトをデーモン化して起動！

実行権限を付与：
`chmod +x logtime.sh`

daemonizeコマンドで
`daemonize ./logtime.sh`

これでこのスクリプトは 本格的なデーモン としてバックグラウンドで動き続けます。


### 終わらせ方

PIDを調べる：
`ps aux | grep logtime.sh`

プロセスを終了する：
`kill <PID>`


# まとめ

|項目	|方法|
|-------|----|
|簡易デーモン	|./script.sh & でバックグラウンド起動
|本物のデーモン	|daemonize を使って、**プロセスをターミナルセッションから切り離す** 等
|さらに本格的に	|Pythonなどでdaemonプロセスを書く／systemdでサービス登録する


# 感想
うーん、以前よりは理解が深まった気はする。といった感じかな。
てかそもそも、`systemd` だとか `サービス` だとか、まだまだ周辺知識に抜けを感じるので、
次回からはその辺を地道に勉強してみようと思います。
（昔にLPIC対策本を流し見したけど、全く理解せず問題と回答を短期記憶しただけだったな〜、覚えてねー）