Systemd -Dbusインターフェイスを使用して.serviceファイルを起動するには?

Systemd -Dbusインターフェイスを使用して.serviceファイルを起動するには?

サービスファイルを呼び出すには、Systemd -Dバスインタフェースを使用する必要があります。 D-Busが通信できるメソッドを使用するには、そのメソッドを呼び出すg_dbus_connection_call_sync() 必要があります。また、StartUnit()パラメータモードを " "として指定する必要があります。g_dbus_connection_call_sync()StartUnit()replace

================================================== =========

#define SYSTEMD_MNGR_IF  "org.freedesktop.systemd1.Manager"
#define SYSTEMD_UNIT_IF  "org.freedesktop.systemd1.Unit"
#define SYSTEMD_SERVICE_IF  "org.freedesktop.systemd1.Service"
#define SYSTEMD_PROP_IF  "org.freedesktop.DBus.Properties"
#define SYSTEMD_SERVICE "org.freedesktop.systemd1"
#define SYSTEMD_OBJ "/org/freedesktop/systemd1"

GDBusConnection*   systemd_conn = NULL ;


    ret = g_dbus_connection_call_sync(systemd_conn,
            SYSTEMD_SERVICE,
            SYSTEMD_OBJ,
            SYSTEMD_MNGR_IF,
            "StartUnit",
            NULL,
            NULL,
            G_DBUS_CALL_FLAGS_NONE,
            -1,
            NULL,
            &error);

================================================== ==================代替パラメータをどこに渡すのですか?新しいメソッドStartUnitを定義する必要がありますか?

ベストアンサー1

必要なオリジナルのd-busソリューションではありませんが、systemdsystemdインターフェイスに合わせて調整されたdbus独自のラッパーを使用してください。

私は使うsd_bus_call_method()使用libsystemd-dev:

  • sd_bus* busは割り当てられたオブジェクトです。sd_bus_default()

  • nameエスケープされていない単位名(例foo.service:)。

  • methodその一つです"StartUnit"、、、"StopUnit""RestartUnit"

#include <systemd/sd-bus.h>

static void CallMethodSS(
    sd_bus* bus,
    const std::string& name,
    const std::string& method)
{
    sd_bus_error err = SD_BUS_ERROR_NULL;
    sd_bus_message* msg = nullptr;
    int r;

    r = sd_bus_call_method(bus,
        "org.freedesktop.systemd1",         /* <service>   */
        "/org/freedesktop/systemd1",        /* <path>      */
        "org.freedesktop.systemd1.Manager", /* <interface> */
        method.c_str(),                     /* <method>    */
        &err,                               /* object to return error in */
        &msg,                               /* return message on success */
        "ss",                               /* <input_signature (string-string)> */
        name.c_str(),  "replace" );         /* <arguments...> */

    if (r < 0)
    {
        std::string err_str("Could not send " + method +
                            " command to systemd for service: " + name +
                            ". Error: " + err.message );

        sd_bus_error_free(&err);
        sd_bus_message_unref(msg);
        throw exception(err_str);
    }

    // Extra stuff that might be useful:  display the response...
    char* response;
    r = sd_bus_message_read(msg, "o", &response);
    if (r < 0)
    {
      LogError("Failed to parse response message: %s\n", strerror(-r) );
    }

    sd_bus_error_free(&err);
    sd_bus_message_unref(msg);
}

systemd開発者はここに良い説明を提供しました。

http://0pointer.de/blog/the-new-sd-bus-api-of-systemd.html

おすすめ記事