Запуск службы запуска из самой службы

Я разработал приложение mysvc который работает как (Peta)Linux сервис через /etc/init.d/mysvc-service (имена должны быть разными, потому что это разные "приложения" в словаре petalinux/yocto).

/usr/bin/mysvc проходит через start-stop-daemon:

# start()
start-stop-daemon -S -o --background -x /usr/bin/mysvc
# stop()
start-stop-daemon -K -x /usr/bin/mysvc

Он включает в себя простой HTTP-сервер, который позволяет перезагрузить / выключить окно (работает), и я хочу добавить кнопку перезагрузки, которая будет просто запускаться /etc/init.d/mysvc-service restart (который работает нормально из командной строки).

Я проверил другой вопрос, который перезапускает саму программу, когда я хочу использовать Linux /etc/init.d/ system (которая строит аргументы командной строки и т. д.) из самой программы (т. е. в ответ на HTTP-запрос, обрабатываемый моим сервером), поэтому я попробовал следующие подходы:

daemon()

позвоню daemon() это в основном fork() а также exit() родительский процесс. Дочерний процесс действительно просто запустится /etc/init.d/mysvc-service start:

    if (daemon(1,1) == 0) { // Forks and exit() the parent. We are the child
        system("/etc/init.d/mysvc-service start"); // "start" and not "restart" because the parent process is not running anymore
        exit(0);
    } else {
        perror("daemon()");
    }

fork()

будут fork() и грациозно выйдет из родителя, пока ребенок побежит /etc/init.d/mysvc-service start:

    switch (fork()) {
        case 0: // Child runs command and exits
            system("/etc/init.d/mysvc-service start");
            exit(0);

        case -1: // Error
            perror("fork()");
            break;

        default: // Parent process: gracefully quit
            run = false;
            break;
    }

Оба сбоев с одинаковыми симптомами (потому что они по существу эквивалентны): родительский процесс завершается (как и ожидалось), но не новый mysvc порождается /etc/init.dsystem() вызов.

Я могу решить это в mysvc-service скрипт с простым while ! /usr/bin/mysvc ... ; do echo "Restart" ; done но я хотел бы знать, возможно ли обработать это в C (программа уже обрабатывает сигналы, чтобы выйти, перезагрузить конфигурацию и т. д.).

0 ответов

Другие вопросы по тегам