0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2025-04-21

はじめに

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

デーモンとは?

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

例えば、

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

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

デーモンの特徴

特徴 内容
常駐型 バックグラウンドで起動し続ける
ユーザがログインしていなくても動く システムが起動したときから動いてることも
標準出力・標準エラーを使わない ログファイルに書き出すのが一般的
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で「本物のデーモン」として扱われるプログラムを作る!

本物のデーモンの定義とは?

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

デーモンとして必要な要素:

  1. 標準入出力を閉じる(端末と切り離す)
  2. 親プロセス(= bashシェル)から切り離す(セッションの独立)
  3. バックグラウンドで動き続ける
  4. PIDファイルを作る(管理しやすくするため)
  5. ログ出力をファイルなどに行う

シンプルな「本物のデーモン」のサンプル(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対策本を流し見したけど、全く理解せず問題と回答を短期記憶しただけだったな〜、覚えてねー)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?