デーモン、サーバー、ユニットの違い

サーバー、デーモン、ユニットの違いについて「これ間違ってんじゃね?」とか「うん微妙だ」などと思うことがあります。

そこで今回は、それそれの定義を踏まえて個人的な見解を示します。

と、その前に 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...]

結論

まあ、システム管理者でもなければ、これらの違いは意識する必要はありません。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です