И так у нас сейчас есть сервис он же демон, который работает потенциально бесконечно.

Но что будет, если по какой-то причине в коде произойдет непредвиденная ситуация и произойдет исключение.

Давайте попробуем смоделировать такую ситуацию.

Генерим ошибку

Чтобы вызывать ошибку надо добавить в заголовки

#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

запустим теперь параллельно лог и процесс и понаблюдаем как процесс перезапустится:

то есть как видим попытка изменить файл в папке создает ошибку, наша программа падает, но так как ее мониторит супервизор, то она успешно перезапускается.

Задание

Реализовать обработку какой-нибудь фразы в файлике в результате которой программа будет падать с ошибкой.

То есть пишешь например в файл “Умри” и демон должен падать.