Сбой службы Sytemd при перезагрузке системы с помощью C reboot API

#c #linux #systemd

#c #линукс #systemd

Вопрос:

Я создаю программу на C , которая динамически создает файл службы sytemd. Эта служба выполняет сценарий при перезагрузке. Этот скрипт также создается динамически и удаляет определенные файлы, отключает и удаляет службу, а затем удаляет себя. Моя служба примерно такова:

 [Unit] Description = Run script on Reboot Before =  [Service] Type=simple ExecStart=/var/tmp/myscript [Install] WantedBy=multi-user.target  

И мой сценарий таков:

 rm -rf files systemctl disable myservice.service rm -f /etc/systemd/system/myservice.service rm -f /var/tmp/myscript  

После создания скрипта и сервиса программа перезагружает систему с помощью reboot API, передавая LINUX_REBOOT_CMD_RESTART в качестве параметра. Однако моя служба выходит из строя после перезагрузки, и файлы не удаляются. Я даже добавил sync API перед перезагрузкой. Я протестировал эту службу самостоятельно, вручную создав ее, а затем вручную перезагрузив систему, в этом случае она работает так, как задумано. Я даже попытался заменить API перезагрузки на

 system("init 6")   

И это тоже дает ожидаемые результаты. Итак, почему reboot api, в частности, создает проблемы? что этот API делает дополнительно, что может повлиять на службу? Я также заметил, что существует некоторая задержка между вызовом API и началом перезагрузки, в то время как вызов system("init 6") имеет очень меньшую задержку, почти мгновенно начинается перезагрузка. Что делает перезагрузка, которая может помешать работе службы, и будет ли передача какого-либо другого параметра вести себя так же, как init 6 ? Кроме того, я выполняю программу в режиме sudo, поэтому в команде init нет дополнительного sudo

Правка: Я также протестировал другие команды перезагрузки с помощью system C api. Я попробовал system("reboot") , system("systemctl reboot") и оба они работают, сервис отлично работает при их использовании. Таким образом, проблема возникает только при использовании reboot C Api. Итак, есть ли какие-то различия в api и этой команде? делает ли API что-то дополнительное, что может помешать работе службы?

Комментарии:

1. Простите за очевидное, но когда вы создаете /var/tmp/myscript , вы делаете его исполняемым? (например chmod x /var/tmp/myscript )

2. @DavidC.Rankin да, в самом коде добавлено разрешение на выполнение. как я уже сказал, это прекрасно работает с init 6