#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