Задания перезапуска systemd при условии

У меня есть демон только для Windows, работающий на Linux с вином и Xvfb. Из-за этой довольно экспериментальной установки демон периодически дает сбой, и я хотел бы реализовать какой-то механизм для автоматического перезапуска демона. В настоящее время у меня есть определение модуля systemd с настройкой Restart = always .

Однако я заметил, что иногда демон дает сбой, но не выходит из процесса. Это эквивалент отображения диалогового окна с вопросом «Демон разбился, хотите отправить отчет об ошибке?». Итак, процесс все еще выполняется, но демон перестал работать.

Единственное внешнее поведение этого явления, которое я могу исследовать на своем Linux-сервере, - это два новых файла, которые появляются в определенном месте, но с переменными именами файлов (они зависят от времени и имеют отметку времени в своем имени). Думаю, это какой-то дамп памяти или трассировки стека, которые изначально следует использовать для отправки отчета об ошибке.

Итак, теперь я ищу решение для systemd, чтобы захватить это решение, например

  1. При запуске модуля посмотрите на целевой каталог аварийного дампа и сделайте снимок содержимого каталога.
  2. Запустите демон
  3. Периодически просматривайте каталог и проверяйте наличие новых файлов, которых нет в снимок, основанный на каком-то регулярном выражении, перезапустите демон и обновите снимок.

Я думал об оболочке, написанной на bash или чем-то подобном, но есть две проблемы: во-первых, я не знаю, как реализовать это поведение, и во-вторых , это сделало бы использование systemd полностью устаревшим, поскольку сценарий обрабатывает всю обработку сбоев, а systemd будет выполнять только сценарий.

Я также думал о том, чтобы просто периодически перезапускать демон с указанными функциями systemd, но это было бы довольно неэффективно (учитывая тот факт, что демон Windows в винной оболочке не t неэффективен в первую очередь), поскольку он иногда перезапускал демон, когда в этом нет необходимости, или после сбоя демона требовалось некоторое время, пока не сработает периодический перезапуск.

Какое было бы лучшее решение для решения этой проблемы ?

И только для справки: демон, о котором я говорю, - это Загрузчик для Google Фото. Google по какой-то причине не выпускает его для Linux.

1
задан 2 March 2017 в 10:15
2 ответа

Хорошо, я обнаружил мощь systemd.path.

Я создал вторую служебную единицу с помощью ExecStart = systemctl restart daemon.unit и Type = oneshot . После этого я создал третий модуль, модуль пути с PathModified = <выходной каталог аварийного дампа> и Unit = daemon-restart.unit .

Теперь он работает. Мне нужно только убедиться, что никакой другой процесс не записывает в выходной каталог, но это можно решить с помощью нескольких разных винных префиксов.

4
ответ дан 3 December 2019 в 17:03

Я думаю, ваша проблема в том, что ваша программа может давать сбой, а Wine - нет, поэтому systemd не видит ничего плохого (PID все еще присутствует).

Во-первых, вы можете найти некоторую помощь в ответах на этот вопрос: Запустить службу SystemD по условию?

Я думаю, вам может потребоваться немного подробнее описать свои потребности (и / или подумать о том, чтобы изменить их, чтобы упростить настройку).

В принципе, я думаю, что решение будет сводиться к умному использованию ConditionPathExistsGlob =, возможно, во вспомогательном модуле.

Хакерское решение может включать модуль таймера с таким условием PathExistsGlob, который может перезапускать вашу основную службу. Я бы предпочел, чтобы этот модуль таймера также занимался очисткой файлов / дампов, а не заставлял это делать основной модуль, но это почти наверняка вопрос вкуса.

Так что я бы не стал трогать то, что вы есть, но вместо этого добавьте что-то вроде (NB: это предположение, а не проверено):

[Unit]
Description=Detect and recover issues with Uploader
After=uploader.service
Requires=uploader.service
PartOf=uploader.service
AssertPathExistsGlob=/srv/uploader/crash*.dump

[Service]
Type=oneshot
ExecStart=cleanup_script
Restart=on-success

Основная логика:

  • вы запускаете это по таймеру, скажем, каждые 5 минут (или что-то еще, что имеет смысл для вашего потребности)
  • если файлы сбоя отсутствуют, блок таймера не запускается, а основная служба загрузчика продолжает работать
  • , если файлы сбоя присутствуют, запустите какой-нибудь собственный скрипт, чтобы сделать с ними правильные действия , и перезапустите наш таймер (который из-за PartOf, должен также перезапустить основную службу Uploader)

Я не говорю, что это отличное решение, но это может быть решением

1
ответ дан 3 December 2019 в 17:03

Теги

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