はじめに
「そもそもデーモンって何やっけ?」って感じの新人エンジニアである私ですが、ここ最近暇すぎたのでデーモンについて調べてみた結果をまとめてみます。
まずは基本的なところからおさらして、とりあえず超シンプルなデーモンを作って動かすところまで行ってみたいと思います。
デーモンとは?
簡単に言うと 「バックグラウンドでずっと動いているプログラム」 のことです。
例えば、
- 時間になったら自動でバックアップを取る
- 閾値に達したら警告を出す
- ネットワークに異常がないかずっと見張る
といった処理を人間の代わりに常に待機・自動対応してくれるのがデーモンです。
デーモンの特徴
特徴 | 内容 |
---|---|
常駐型 | バックグラウンドで起動し続ける |
ユーザがログインしていなくても動く | システムが起動したときから動いてることも |
標準出力・標準エラーを使わない | ログファイルに書き出すのが一般的 |
PIDファイルを残す | 自分のプロセスIDをファイルに書いておく(管理のため) |
なぜ「デーモン」と呼ぶの?
Unixの開発者たちが、ギリシャ神話の「daemon(精霊)」から名付けたとされています。
人の目には見えないけど、何かを助けてくれる存在、というイメージですね。
まずは体験!超シンプルな「擬似デーモン」
ここでは「デーモンっぽい動きをする簡単なシェルスクリプト」を用意してみます。
スクリプト
logtime.sh
#!/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で「本物のデーモン」として扱われるプログラムを作る!
本物のデーモンの定義とは?
「バックグラウンドで動かすだけ」では本物のデーモンとは言いません。
デーモンとして必要な要素:
- 標準入出力を閉じる(端末と切り離す)
- 親プロセス(= bashシェル)から切り離す(セッションの独立)
- バックグラウンドで動き続ける
- PIDファイルを作る(管理しやすくするため)
- ログ出力をファイルなどに行う
シンプルな「本物のデーモン」のサンプル(Bash + daemonizeコマンド)
Bashだけで本格的なデーモンを書くのはやや手間ですが、daemonize というツールを使うとすごく簡単です。
daemozizeコマンドとは
daemonize コマンドは、任意のプログラムをデーモンとして実行するためのユーティリティです。
基本的な役割
プログラムをデーモン化するには通常、以下の処理が必要です。
処理内容 | 意味・目的 |
---|---|
親プロセスからの切り離し | ターミナルに依存せず動作するため |
標準入出力の切断 | ターミナルと無関係にするため |
カレントディレクトリの変更 | セキュリティや一貫性のために変更するのが一般的 |
umaskの設定 | デフォルトのファイルパーミッションの制御 |
PIDファイルの作成 | プロセスの識別や管理のため |
ログファイルの指定 | 出力内容をファイルに記録するため |
これらを 一括でやってくれるのが daemonize コマンド です。
使用例
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
#!/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対策本を流し見したけど、全く理解せず問題と回答を短期記憶しただけだったな〜、覚えてねー)