デーモン (ソフトウェア)

**デーモン** () は、UNIX, Linux, Mac OS XなどUnix系のマルチタスクオペレーティングシステム (OS) において動作するプロセス（プログラム）で、主にバックグラウンドで動作するプロセス。ユーザが直接対話的に制御するプログラムもデーモンとして作ることができる。典型的なデーモンは名前の最後尾に "d" が付く。例えば、syslogd はシステムログを扱うデーモン、sshd は内外のSSH接続要求を受け付けるデーモンである。

Unix系の環境では、常にではないが、デーモンの親プロセスはinitプロセスとなっていることが多い。デーモンは起動処理内でforkで子プロセスを作成し、親プロセスの方が即座に終了するため、init が里親となる。さらにデーモンまたはOSは制御端末 (tty) からの切り離しなどの処理も行う必要がある。こういったデーモンを生成するための手続きをUnix系では *daemon(3)* などの便利なルーチンにまとめて実装していることが多い。

システムは、ブート処理の延長上でデーモンを多く起動する。ネットワークからの要求を処理するもの、ハードウェアの何らかの活動を処理するものなどがある。他にも、一部のLinuxシステムの udevd のようにハードウェアの設定を行うもの、cronのようにスケジュールされたタスクを実行するものなど、様々な処理を担っている。

## 語源と用語
ダイモーン（daemon）とはギリシャ神話に登場し、神々が煩わされたくないと考えた雑事を処理した存在である。同様にコンピュータのデーモンもユーザーが煩わされたくないタスクをバックグラウンドで実行する。

フェルナンド・J・コルバトによれば、MITのProject MACで働いていた1963年、彼のチームがデーモン (daemon) という用語を初めて使ったという。分子をより分けてくれるという物理学や熱力学の空想上の存在であるマクスウェルの悪魔 (Maxwell's demon) が発想の元となっている。

我々は気まぐれに、システムの雑用をこなしてくれるバックグラウンドプロセスを「デーモン」と呼び始めた。

UNIXシステムがその用語を受け継いだ。BSDとその派生OSはデーモンをマスコットとしている。このマスコットはキリスト教によく見られる悪魔 (demon) の姿をしている。欧米では、"demon" と綴ることも多い。どちらも発音は同じで、カタカナ表記すると「ディーマン」「ディーモン」が近い。

一般的意味でのdaemonはdemonの古い綴りであり、ギリシア語のに由来する。*Unix System Administration Handbook* でEvi Nemethは次のように記している。

多くの人々が "daemon" という語と "demon" という語を同等視しており、UNIXと冥界の間にある種の悪魔的関係があるように感じている。これは言語道断な誤りである。"daemon" は実際には "demon" のより古い形であり、daemon自体には善または悪への特定の偏向の意味はなく、むしろ個人の性格や個性を説明付ける役割を担っていた。古代ギリシアにおける「個人的daemon」の概念は現代の守護天使に近く、*eudaemonia* は親切な精霊によって助けられたり保護されたりしている状態を意味する。現実にはUNIXシステムではdaemonとdemonの両方が横行しているようだ。(p.403)

神話的象徴としてのさらなる説明をすれば、daemonは目には見えないが常に側にいて、その意志を働かせている何ものかである。プラトンの著作で、ソクラテスは自身の個人的daemonを現代的な道徳的良心のような概念として説明している。

デーモンと同様の意味で使われている用語としては、サービス (Windows NT)、サブシステム (IBM z/OS)、サーバ・バーチャル・マシン (IBM VM)、ゴーストジョブ (XDS UTS) などがある。

## 生成
技術的に厳密に言えば、Unix系システムでは親プロセスが終了していて initプロセス（プロセス番号1）を親プロセスとしていて制御端末を持たないプロセスをデーモンと認識する。POSIX準拠のOSにおけるプロセス管理の下では、デーモンプロセスは以下の性質を持つ。
* 独立したセッションに所属する。これにより、親プロセスのセッションリーダーが終了しても影響を受けず、実行を継続する。
* 制御端末を持たない。これはシェルや制御端末によるジョブ制御の対象にならないことを意味する。
親プロセスが子プロセスの終了を待たずに先に終了した場合、initプロセスが終了した親プロセスの代わりに残された子プロセスの親となる。しかし一般的なUNIXの用例として、initの子プロセスになっているかどうかに関わらず、バックグラウンド動作するプロセスを（広義の）デーモンと呼ぶ場合もある。

POSIX準拠のOSにおいて、デーモンを起動する一般的な手法は次の通りである。
* forkを実行する。POSIXではプロセスグループのリーダーとなっているプロセスが新規にセッションを開始することを禁止しているために必要な処理である。この処理は親プロセスが正常に実行し続けていても可能である。この段階で親プロセスが直ちに終了する実装の場合、この処理を "fork off and die" と呼ぶ。
* setsidを実行する。これにより、上記にて開始した子プロセスは新しいセッションに所属し、親プロセス側のセッション制御対象から外れる。また、POSIXの仕様に基づき、このプロセスは新しいプロセスグループに所属し、制御端末を持っていた場合はこれを失う。これにより、親プロセスおよび制御端末によるジョブ制御対象からも外れる。
* プロセスのカレントディレクトリをルートディレクトリ ("/") にすることにより、プロセスが他のディレクトリを使用中にしないようにする。
* umaskを0に変更する。これは、open()、creat()、その他の呼出しに、それら自身のパーミッションマスクを与え、呼出し側のumaskに影響されないようにするためである。
* 実行時に親プロセスがオープンしたままの、親プロセスから継承したすべてのオープンファイルをクローズする（必要なファイルは後からオープンする）。クローズするファイルにはファイルデスクリプタ0,1,2（stdin標準入力,stdout標準出力,stderr標準エラー出力）も含まれる。
* 標準ストリーム (stdin, stdout, stderr) をログファイルまたはコンソールまたは/dev/nullにリダイレクトする。
* シグナルハンドラをインストールする。これはデーモンを外部から制御する手段としてしばしば使用される。
ちなみに、4.4BSDを祖先とするBSD系OS、glibcを採用したLinux系OSなど、最近のUnix系システムには、上述した処理を行う関数daemon()が用意されており、その関数を使うだけで自プロセスをデーモンに変えることができる。

## DOSとMicrosoft Windowsでの実装
DOS環境では、そのようなプログラムをTSR (Terminate and Stay Resident) ソフトウェアとして書いた。Windows NTシステムでは、Windowsサービスと呼ばれるプログラムがデーモンの役割を担っている。それらはプロセスとして動作し、モニター/キーボード/マウスは全く使わず、ブート時にOSが起動することが多い。Windows 2000およびそれ以降では、Windowsサービスはコントロールパネルのサービスコントロールマネージャ（scコマンド）などを使ってユーザーが設定したり、停止/起動したりできるようになった。

しかし、Windowsでは一部の常駐アプリケーションなどもデーモンのように振る舞うことができ、一部のWindowsサービスは通常プロセスのように動作するオプションを備えている。

## Mac OS での実装
初期のClassic Mac OSでは、オプション機能やサービスを立ち上げ時にファイルとしてロードしOSにパッチとして当てる機能があった。それらをsystem extensionsおよびcontrol panelsと呼んでいた。その後のMac OSでは、それらがウィンドウ表示されないバックグラウンドで動作する普通のアプリケーションとして発展していった。ユーザーにはそれらを依然としてsystem extensionsと説明していた。

Mac OS X以降（macOS）はUNIXなので、デーモンが使われている。なお、macOSにはServiceというものもあるが、これは全く異なるコンセプトであり、Windowsでいうところのサービス (Windows Service) とは別物である。

## UNIX/Unix系システムでのデーモンの例
* タスクスケジューリング (Crontab, at) 系デーモン - anacron、atd、crond
* システム管理系デーモン - apmd、init、klogd、launchd (macOS)、syslogd、webmin
* Network File System 関連デーモン - nfsd、mountd、rquotad
* 周辺機器関連デーモン - blued (macOS)、cupsd、kerneld（LKM用デーモン）、mpd、pcmcia
* 通信プロトコルサーバ - bootparamd、dhcpd、fingerd、ftpd、httpd、inetd、isdn、named、ntpd、portmap、routed、rpcbind、snmpd、squid、sshd、tcpd、telnetd、xfsd（Xフォントサーバ）、xinetd、ypbind
** 電子メール - fetchmail、imapd、postfix、sendmail、smtpd
** Samba - nmbd、smbd
* 分散メモリキャッシュ - memcached
* データベースサーバ - mysql、postgresql

## 脚注

## 関連項目
* サーバ
* Java Service Wrapper
* Terminate and Stay Resident
* ユーザ空間
* Windowsサービス
* Webサービス

## 外部リンク
* start-stop-daemon man page
* The BSD Daemon
* daemon man page
* Tutorial: Unix Daemons in Perl
* How to daemonize in Linux
* Unix Daemon Server Programming
* Linux Daemon Writing HOWTO