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




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


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


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




目次






  • 1 語源と用語


  • 2 生成


  • 3 MS-DOS と Microsoft Windows での実装


  • 4 Mac OS での実装


  • 5 UNIX/Unix系システムでのデーモンの例


  • 6 脚注


  • 7 関連項目


  • 8 外部リンク





語源と用語


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


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



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



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


一般的意味でのdaemonはdemonの古い綴りであり、ギリシア語のδαίμωνに由来する。Unix System Administration Handbook でEvi Nemethは次のように記している[7]



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



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


.mw-parser-output .templatequote{overflow:hidden;margin:1em 0;padding:0 40px}.mw-parser-output .templatequote .templatequotecite{line-height:1.5em;text-align:left;padding-left:1.6em;margin-top:0}


神の好意は私に信じられない贈り物を与え、それは幼少期以来一度も私から離れたことがない。それは声であり、その声が聞こえてくるとき、私がしようとしていることを阻止しようとし、決してそれを私に勧めない。



Character of Socrates in "Theages", Plato[8]


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



生成


技術的に厳密に言えば、Unix系システムでは親プロセスが終了していて initプロセス(プロセス番号1)を親プロセスとしていて制御端末を持たないプロセスをデーモンと認識する。親プロセスが子プロセスの終了を待たずに先に終了した場合、initプロセスが終了した親プロセスの代わりに残された子プロセスの親となる。しかし一般的なUNIXの用例として、initの子プロセスになっているかどうかに関わらず、バックグラウンド動作するプロセスを(広義の)デーモンと呼ぶ場合もある。


デーモンを起動する一般的な手法は次の通りである。



  • プロセスを制御端末 (tty) から切り離す。

  • プロセスをセッションリーダーにする。

  • プロセスをプロセスグループのリーダーにする。


  • forkとexitを1度か2度行い、プロセスをバックグラウンドに残す。この処理は、プロセスをセッションリーダーにするためにも必要なこともある。また、この処理は親プロセスが正常に実行し続けても可能である。この処理を "fork off and die”と呼ぶ。

  • プロセスのカレントディレクトリをルートディレクトリ("/")にすることにより、プロセスが他のディレクトリを使用中にしないようにする。


  • 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()が用意されており、その関数を使うだけで自プロセスをデーモンに変えることができる。



MS-DOS と Microsoft Windows での実装


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


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



Mac OS での実装


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


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



UNIX/Unix系システムでのデーモンの例




  • タスクスケジューリング (Crontab, at) 系デーモン - anacron、atd、crond


  • システム管理系デーモン - apmd、init、klogd[9]、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



脚注





  1. ^ Eric S. Raymond. “daemon”. The Jargon File. 2008年10月22日閲覧。


  2. ^ タスクモニタを用いてのシステムツールの開発実習 https://www.toppers.jp/edu-base1.html


  3. ^ 出典[1]、[2]、他


  4. ^ “The Origin of the word Daemon”. 2012年7月5日閲覧。


  5. ^ 「マクスウェルの悪魔」とされているが、一説には "Maxwell's daemon" であり「マクスウェルの守護神」。フェルナンド・J・コルバト (2002年1月23日). “Take Our Word for It”. 2006年8月20日閲覧。


  6. ^ “Merriam-Webster definition of daemon”. Merriam-Webster Online. 2009年8月5日閲覧。


  7. ^ “The BSD Daemon”. Freebsd.org. 2008年11月15日閲覧。


  8. ^ なお、"Theages" はプラトンの作品でないとされることもあるが、この部分は明らかにdaemonのギリシア的概念を明確に示したものである。


  9. ^ klogd




関連項目



  • サーバ

  • 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




Popular posts from this blog

MongoDB - Not Authorized To Execute Command

How to fix TextFormField cause rebuild widget in Flutter

in spring boot 2.1 many test slices are not allowed anymore due to multiple @BootstrapWith