Qtの応用 - Systemd

提供:MochiuWiki : SUSE, EC, PCB
2024年6月14日 (金) 19:46時点におけるWiki (トーク | 投稿記録)による版 (ページの作成:「== 概要 == サービスとは、PCの起動時に自動的に実行され、バックグラウンドで仕事をするために待機するソフトウェアのことである。<br> <br> 一般的に、サービスはグラフィカルユーザインターフェースを持たず、ユーザの操作無しに動作する。<br> 最もよく知られているサービスは、Web、メール、データベース等のサーバで、Apache、MySQL等がある。<br…」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

概要

サービスとは、PCの起動時に自動的に実行され、バックグラウンドで仕事をするために待機するソフトウェアのことである。

一般的に、サービスはグラフィカルユーザインターフェースを持たず、ユーザの操作無しに動作する。
最もよく知られているサービスは、Web、メール、データベース等のサーバで、Apache、MySQL等がある。

また、ハードウェアの検出やUSBメモリの自動統合(マウント)等もサービスによって行われる。

サービスには、システム起動時に関連するタスクやハードウェアに関連するタスクを行う"内部サービス"と、
その後にユーザがインストールするサービス(通常は全てのサーバサービスを含む)の2種類がある。

技術用語やコンピュータ用語では、サービスは伝統的にデーモンと呼ばれている。
そのため、サーバコンポーネントであるsshdやmysqldのように、サービスを表すプログラムの最後の文字として"d"が用いられることが多い。

一方、Systemdは、システムおよびセッションマネージャ(initシステム)であり、
コンピュータの起動プロセスからシャットダウンまでの全動作時間にわたって、システム上で動作するすべてのサービスを管理する役割を担っている。

プロセスは常に(可能な限り)並行して起動され、起動プロセスを可能な限り短くする。
ここで、.serviceで終わる設定ファイルを作成して、Systemdが制御・監視するプロセスに関するコードを保持する場合をSystemd Service Unitファイルと呼ぶ。

Systemdには、サービス、タイマ、マウントポイント、ソケット、スワップスペース、デバイス等のユニットが存在する。
そのため、Systemdは管理用の設定の全てをファイルから取得する。

Systemdの用語では、これらを"ユニット"と呼び、システム全体に適用されるユニットと各ユーザ領域にのみ適用されるユニットがある。

ユニットには、サービスを開始するためのサービスユニットや、ある時点でのアクションを(繰り返し)実行するためのタイマユニット等、様々な種類がある。

各タイプのユニットファイルに共通しているのは、iniファイルに似た構造をしていることである。
ユニットファイルは、いくつかのセクション(多くの場合、3セクション)で構成されている。

Systemdではセクションと呼ばれ、その中に一連のキーと値のペア(Systemdではディレクティブと呼ばれる)が格納されている。


Systemdライブラリのインストール

ライセンス

Systemdライブラリのライセンスは、LGPL v2.1以降、または、 GPL 2.0である。

パッケージ管理システムからインストール

# RHEL
sudo dnf install systemd-devel

# SUSE
sudo zypper install systemd-devel


ソースコードからインストール

SystemdのGithubにアクセスして、ソースコードをダウンロードする。
ダウンロードしたファイルを解凍する。

tar xf systemd-<バージョン>.tar.gz
cd systemd-<バージョン>


Systemdをビルドおよびインストールする。

mkdir build && cd build

../configure --prefix=<Systemdのインストールディレクトリ>
make -j $(nproc)
make install



サンプルコード

QProcessクラスやD-Busを使用せずに、Systemdを利用してSSHデーモンを起動する場合は、Systemdのライブラリを使用する必要がある。

以下の例では、Systemdのライブラリを使用してSSHデーモンを起動している。

  1. sd_booted関数を使用して、システムがSystemdで起動されているかどうかを確認する。
    0を返す場合は、Systemdで起動されていることを示す。
    0以外を返す場合は、Systemdで起動されていないことを示す。

  2. Systemdで起動されている場合は、sd_service_start関数を使用して、sshd.serviceを起動する。
    0を返す場合は、サービスの起動に成功したことを示す。
    0以外を返す場合は、サービスの起動に失敗したことを示す。
    エラーメッセージを表示して、プログラムを終了する。
  3. Systemdで起動されていない場合は、エラーメッセージを表示して、プログラムを終了する。


このサンプルコードを実行するには、libsystemd-devパッケージがインストールされている必要がある。
また、適切な権限でプログラムを実行する必要がある。

※注意
この方法は、Systemdが利用可能なシステムでのみ動作する。

 #include <QCoreApplication>
 #include <QDebug>
 #include <systemd/sd-daemon.h>
 
 int main(int argc, char *argv[])
 {
    QCoreApplication a(argc, argv);
 
    // Systemdライブラリを使用してSSHデーモンを起動
    int ret = sd_booted();
    if (ret == 0) {
       qDebug() << "Running under systemd.";
 
       ret = sd_service_start("sshd.service");
       if (ret == 0) {
          qDebug() << "sshd serviceを開始";
       }
       else {
          qDebug() << QString("sshd serviceの開始に失敗: %1").arg(strerror(-ret));
          return -1;
       }
    }
    else {
       qDebug() << "Not running under systemd.";
       return -1;
    }
 
    return a.exec();
 }