Метод для определения того, какой `Тип` службы systemd использовать для любого данного приложения

Я нашел ответ здесь, Как перераспределить маршруты из таблицы ядра в протокол OSPF? и изменил конфигурацию OSPF для создания фильтра для удаления маршрутов, полученных от OSPF.

Модификация будет произведена соответствующим образом для всех элементов кластера anycast DNS.

Обратите внимание на фильтр импорта _OSPF, добавленный в измененную конфигурацию OSPF.

filter import_OSPF {
    reject;
}

protocol ospf {
        tick 2;
        rfc1583compat yes;

        import filter import_OSPF;
        area 0.0.0.0 {

            networks {
                1.1.1.0/22;
            };
            stubnet 2.2.2.2/32 {
                 cost 100;
            };
            stubnet 3.3.3.3/32 {
                 cost 500;  
            };
            stubnet 4.4.4.4/32 {
                 cost 1000;
            };
            stubnet 5.5.5.5/32 {
                 cost 900;
            };
            interface "eth0" {
                cost 1000;
                password "MySecretPassword" {
                    id 5;
                };
                authentication cryptographic; 
            };

            interface "dummy0" {
                stub;
            };
            interface "dummy1" {
                stub;
            };
            interface "dummy2" {
                stub;
            };
            interface "dummy3" {
                stub;
            };

        };
}

После перезапуска BIRD диагностическая команда «show route» в birdcуже не показывает импортированные маршруты OSPF, как предполагалось.

5
03.10.2019, 12:41
1 ответ

(Скопировано из моего ответа на Super User.SE.)

Когда вы запускаете службу вручную из командной строки (без использования команды префикса nohupили суффикса &для ее запуска в фоновом режиме, или, другими словами, просто запускаете команду, которую вы бы ввели строка ExecStart=файла .service), что происходит?

a)Если служба запускается и продолжает работать, а подсказка не появляется до тех пор, пока вы не нажмете Control -C или не остановите службу каким-либо другим способом :, тогда Type = simpleявляется правильным выбором.

b)Если подсказка возвращается, но служба продолжает работать в фоновом режиме (, т. е. служба сама демонизирует себя ), тогда Type = forkingявляется правильным выбором.

c)Если служба выполняет свою работу и возвращается к подсказке, не оставляя ничего запущенным (, т.е. служба просто настраивает некоторые параметры ядра, отправляет команду чему-то другому или делает что-то подобное ), то Type = oneshot, вероятно, правильный выбор. В этом случае ExecStartслужбы может быть командой «установить» что-либо, а ExecStop— соответствующей командой «снять». Этот тип обычно выигрывает от RemainAfterExit=true,поэтому systemd будет отслеживать «состояние» этой службы в зависимости от того, была ли она в последний раз «установлена» или «сброшена».

Другие значения Typeявляются особыми случаями. Например, если услуга использует соединение по шине D -, лучшим выбором может быть Type = dbus. Он сообщает systemdоб этом факте, а затем systemd будет отслеживать эту службу (и все, что от нее зависит ), по наличию этой службы на шине D -.

Чтобы использовать Type = notify, процесс должен иметь возможность подключаться к сокету Unix, указанному в переменной среды $NOTIFY_SOCKET, и сообщать о своем состоянии, отправляя сообщения в этот сокет, когда это необходимо. Кроме того, в служебном файле должна быть указана опция NotifyAccessдля предоставления доступа к сокету уведомлений по мере необходимости.

Существует командная -линейная утилита systemd-notifyи библиотечная функция C sd_notify(3), которую вы можете использовать для отправки этих сообщений, но если ни один из них не подходит для ваших требований, вы можете просто реализовать свой собственный отправитель сообщений. Требуемые сообщения очень просты и выглядят как назначения переменных оболочки :, например, чтобы уведомить, что служба успешно завершила запуск и готова обслуживать любые входящие запросы, служба должна отправить строку, эквивалентную выходным данным printf "READY=1\n". ] к сокету. См. man 3 sd_notifyдля получения более подробной информации о распознанных сообщениях.

Примечание :Многие служебные приложения, предназначенные для переноса на многие системы в стиле Unix -, могут вести себя как b )по умолчанию, но их можно заставить работать как ), добавив параметр (обычно описывается как «не разветвляться», «продолжать работу на переднем плане», «не демонизировать» или подобное ). В этом случае, если параметр не имеет других побочных эффектов, то добавление параметра и использование поведения типа )-предпочтительнее для systemd.

10
27.01.2020, 20:35

Теги

Похожие вопросы