「Qtの応用 - Systemd」の版間の差分

ナビゲーションに移動 検索に移動
(ページの作成:「== 概要 == サービスとは、PCの起動時に自動的に実行され、バックグラウンドで仕事をするために待機するソフトウェアのことである。<br> <br> 一般的に、サービスはグラフィカルユーザインターフェースを持たず、ユーザの操作無しに動作する。<br> 最もよく知られているサービスは、Web、メール、データベース等のサーバで、Apache、MySQL等がある。<br…」)
 
58行目: 58行目:


== サンプルコード ==
== サンプルコード ==
<code>QProcess</code>クラスやD-Busを使用せずに、Systemdを利用してSSHデーモンを起動する場合は、Systemdのライブラリを使用する必要がある。<br>
<code>QProcess</code>クラスを使用せずに、Systemdを利用してSSHデーモンを起動する場合は、Systemdのライブラリを使用する必要がある。<br>
<br>
<br>
以下の例では、Systemdのライブラリを使用してSSHデーモンを起動している。<br>
以下の例では、Systemdのライブラリを使用してSSHデーモンを起動している。<br>
# <code>sd_booted</code>関数を使用して、システムがSystemdで起動されているかどうかを確認する。
# <code>sd_bus_open_system</code>関数を使用して、システムバスへの接続を開く。
#: 0を返す場合は、Systemdで起動されていることを示す。
#: 戻り値が負の値の場合は、接続に失敗したことを示す。
#: 0以外を返す場合は、Systemdで起動されていないことを示す。
# <code>sd_bus_call_method</code>関数を使用して、SystemdのD-Busインターフェイスを介してsshd.serviceを起動する。
#: <br>
#: 関数の引数には、バスの接続、D-Busサービス名、D-Busオブジェクトのパス名、インターフェイス名、メソッド名、入力引数、出力引数、起動するサービス名とモードを指定する。
# Systemdで起動されている場合は、<code>sd_service_start</code>関数を使用して、sshd.serviceを起動する。
#: 戻り値が負の値の場合は、サービスの起動に失敗したことを示す。
#: 0を返す場合は、サービスの起動に成功したことを示す。
#: サービスの起動に成功した場合は、成功メッセージをデバッグ出力に表示している。
#: 0以外を返す場合は、サービスの起動に失敗したことを示す。
# <code>sd_bus_unref</code>関数を使用して、バスの接続を閉じる。
#: エラーメッセージを表示して、プログラムを終了する。
# Systemdで起動されていない場合は、エラーメッセージを表示して、プログラムを終了する。
<br>
<br>
このサンプルコードを実行するには、libsystemd-devパッケージがインストールされている必要がある。<br>
このサンプルコードを実行するには、Systemdライブラリがインストールされている必要がある。<br>
また、適切な権限でプログラムを実行する必要がある。<br>
また、適切な権限でプログラムを実行する必要がある。<br>
<br>
<br>
80行目: 78行目:
  #include <QCoreApplication>
  #include <QCoreApplication>
  #include <QDebug>
  #include <QDebug>
  #include <systemd/sd-daemon.h>
  #include <systemd/sd-bus.h>
   
   
  int main(int argc, char *argv[])
  int main(int argc, char *argv[])
86行目: 84行目:
     QCoreApplication a(argc, argv);
     QCoreApplication a(argc, argv);
   
   
     // Systemdライブラリを使用してSSHデーモンを起動
     // Systemdを使用してSSHデーモンを起動
     int ret = sd_booted();
    sd_bus *bus = nullptr;
     if (ret == 0) {
     int ret = sd_bus_open_system(&bus);
       qDebug() << "Running under systemd.";
     if (ret < 0) {
      qDebug() << QString("システムD-Busの接続に失敗: %1").arg(strerror(-ret));
      return -1;
    }
    ret = sd_bus_call_method(bus,
                            "org.freedesktop.systemd1",
                            "/org/freedesktop/systemd1",
                            "org.freedesktop.systemd1.Manager",
                            "StartUnit",
                            nullptr,
                            nullptr,
                            "ss",
                            "sshd.service",
                            "replace");
    if (ret < 0) {
       qDebug() << QString("SSHサービスの開始に失敗: %1").arg(strerror(-ret));
      sd_bus_unref(bus);
   
   
      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 -1;
     }
     }
    qDebug() << "SSHサービスの開始に成功";
    sd_bus_unref(bus);
   
   
     return a.exec();
     return a.exec();

案内メニュー