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