Создание и загрузка сервиса systemd из программы на C ++ - PullRequest
1 голос
/ 19 июня 2020

Я работаю над приложением, которое хотел бы создать и загрузить службу / демон systemd. Мой минимальный рабочий пример выглядит следующим образом:

#define SYSTEM_D_UNIT_PATH "/etc/systemd/system/"
#define LOAD_DAEMON_INTO_SYSD "systemctl start test.timer && "\
    "systemctl enable test.service"

#include <cstdlib>
#include <iostream>
#include <filesystem>
#include <fstream>

int main()
{
    // create the timer daemon
    std::ofstream ofs_t { SYSTEM_D_UNIT_PATH "test.timer" };
    ofs_t << "[Unit]\n" << "Description=test\n\n"
          << "[Timer]\n" << "OnBootSec=15s\n" << "OnUnitActiveSec=15min\n";

    // now create the service itself
    std::ofstream ofs_s { SYSTEM_D_UNIT_PATH "test.service" };
    ofs_s << "[Unit]\n" << "Description=test\n\n"
          << "[Service]\n" << "ExecStart=/home/gcoh/testscript\n\n"
          << "[Install]\n" << "WantedBy=multi-user.target\n";

    // finally, enable the service and start the timer
    std::system(LOAD_DAEMON_INTO_SYSD);
}

Однако, когда я компилирую и запускаю ошибку, я получаю

Failed to start test.timer: Unit test.timer is masked.

Даже если я остановлю таймер, отключите службу, демаскируйте оба, а затем удалите соответствующие файлы из /etc/systemd/system.

Служба и таймер работают должным образом, если я просто запустил

systemctl start test.timer && systemctl enable test.service

, который возвращает

Created symlink /etc/systemd/system/multi-user.target.wants/test.service → /etc/systemd/system/test.service.

(поэтому я подозреваю, что здесь может быть какое-то отношение к символическим ссылкам)

Я немного изучил это, но не мог понять почему, и я подозреваю, что причина может быть немного тонкой, поэтому я ' Буду очень признателен за любую помощь.

...