デーモン、サーバー、ユニットの違い
サーバー、デーモン、ユニットの違いについて「これ間違ってんじゃね?」とか「うん微妙だ」などと思うことがあります。
そこで今回は、それそれの定義を踏まえて個人的な見解を示します。
と、その前に Linux/UNIX における「プログラム」、「プロセス」、「アプリケーション」の違いは
- プログラム
コンピューター上で何かしらの処理を行うもの - プロセス
実行中のプログラム。必ずプロセスIDを持つ - アプリケーション
プログラムの中で GUI 操作が行えるもの
となっています。
ちなみに「タスク」には『何かしらから見て実行しなければいけない処理』という意味から、『CPU から見て処理しなければいけないアセンブラ』となりますので TSS などで分割されたプロセスの一部になります。「CPU タスク」とも呼ぶ。
デーモン
一般的な定義では以下のような条件があります。
- 制御端末から切り離されている
- 何かしらの処理を行うプログラム
制御端末とは tty、それに接続された状態とはシェルなどから起動された状態で、「Ctrl + c」などで割り込みが行えます。(もっともデーモンであれば無視しますが…)
通常の実行中コマンドなどが、制御端末に接続された状態と言えます。
プログラム名称は多くの場合「d」で終了します。
語源は「裏でコソコソする悪魔」から来ているとか何とか。
サーバー
何かしらのサービスを提供するモノ。ウォーターサーバーなら水を提供しますが、Linux/UNIX では WEB サービスやメールサービスを提供します。
ただしサーバー自体には制御端末から切り離されている『義務』はなく、処理の内容は『サービスを提供する処理』となりますので、デーモンよりは狭いです。
ただ殆どの場合はサーバーはデーモンに含まれているため [サーバー] = [デーモン] と思われています。(ややこしいのは「サーバーデーモン」と呼ぶ奴がいる事でしょうか…)
ユニット
正式名称で言うなら「Systemd ユニット」でしょうか。
Systemd では「サービス」や「デバイス」、「ターゲット」などを纏めて「ユニット」と読んで管理しています。
「なぜそんな事を?」と思うかも知れません。
例えば Postfix (SMTPD:メール送受信管理デーモン)が管理する(受け付ける)メールアドレスをデータベース(MariaDB)で管理していたとします。
この時、Postfix は MariaDB のデーモン(サーバー)が起動している必要があり、同時に様々なネットワーク関連サービスやネットワークデバイスが「生きている」状態である必要があります。
そしてネットワークデバイスが「生きている」状態にはマルチユーザーターゲット(旧 runleve3 に相当)以上である必要があります。(システムの起動状態で、複数ユーザーが利用可能かつネットワークが利用可能な状態)
サービスを提供するにはサーバーが必要であり、サーバーを起動するには様々な依存関係があります。
その依存関係を Systemd が処理するために考え出されたのが、「サービス」や「デバイス」、「ターゲット」などを「ユニット」という単位で管理する方法です。
例えばログ(ジャーナル)メッセージを管理するコマンド「journalctl」で「postfix」のメッセージを確認する場合は「journalctl -u postfix -f」などとします。(「-u」はユニットを指定)
ユニットを管理するコマンド「systemctl」は次のような文法になっています。
systemctl [OPTIONS...] COMMAND [UNIT...]
結論
まあ、システム管理者でもなければ、これらの違いは意識する必要はありません。