Реализовать обработку какой-нибудь фразы в файлике в результате которой программа будет падать с ошибкой.
То есть пишешь например в файл “Умри” и демон должен падать.
И так у нас сейчас есть сервис он же демон, который работает потенциально бесконечно.
Но что будет, если по какой-то причине в коде произойдет непредвиденная ситуация и произойдет исключение.
Давайте попробуем смоделировать такую ситуацию.
Чтобы вызывать ошибку надо добавить в заголовки
#include <stdexcept>
и внутри программы добавить конструкцию
throw runtime_error("Падаю =ООО");
например сделаю так:
#include <iostream>
#include <sys/inotify.h>
#include <unistd.h>
#include <stdexcept> // ДОБАВИЛ
using namespace std;
int main(int argc, char *argv[])
{
int inotify_fd = inotify_init();
int watch_fd = inotify_add_watch(inotify_fd, "/home/m", IN_MODIFY | IN_CREATE | IN_DELETE);
cout << "-=-=-=-=-=-" << endl
<< "ЗАПУСКАЮСЬ" << endl
<< "-=-=-=-=-=-" << endl;
while (true) {
char buffer[10000];
int length = read(inotify_fd, buffer, 10000);
int i = 0;
while (i < length) {
struct inotify_event *event = (struct inotify_event *)&buffer[i];
// ТУТ ПАДАЮ ЕСЛИ ПРОИЗОШЛО СОБЫТИЕ
throw runtime_error("Падаю =ООО");
i += sizeof(struct inotify_event) + event->len;
}
}
inotify_rm_watch(inotify_fd, watch_fd);
close(inotify_fd);
return 0;
}
перезапустим нашего демона и глянем лог чтобы понять как оно работает
ну разве не прекрасно, падает с концами =)
Только зачем?)
Одной из важнейших задач супервизора является оживление упавших процессов.
В общем, чтобы наш процесс после умирания сразу восстанавливался необходимо добавить в описание сервиса (файл my_daemon.service) строчку
[Unit]
Description=Заклинатель книг
[Service]
User=m
Restart=on-failure # вот эту
WorkingDirectory=/home/m/cpp05
ExecStart=/home/m/cpp05/main
[Install]
WantedBy=multi-user.target
полный список допустимых значений такой
вообще почитать про разные параметры для сервиса можно тут
man systemd.service
после того как подправите файлик надо обновить кэш systemd и перезапустить сервис
sudo systemctl daemon-reload
sudo systemctl restart my_daemon.service
запустим теперь параллельно лог и процесс и понаблюдаем как процесс перезапустится:
то есть как видим попытка изменить файл в папке создает ошибку, наша программа падает, но так как ее мониторит супервизор, то она успешно перезапускается.
Реализовать обработку какой-нибудь фразы в файлике в результате которой программа будет падать с ошибкой.
То есть пишешь например в файл “Умри” и демон должен падать.