У меня есть демон только для Windows, работающий на Linux с вином и Xvfb. Из-за этой довольно экспериментальной установки демон периодически дает сбой, и я хотел бы реализовать какой-то механизм для автоматического перезапуска демона. В настоящее время у меня есть определение модуля systemd с настройкой Restart = always
.
Однако я заметил, что иногда демон дает сбой, но не выходит из процесса. Это эквивалент отображения диалогового окна с вопросом «Демон разбился, хотите отправить отчет об ошибке?». Итак, процесс все еще выполняется, но демон перестал работать.
Единственное внешнее поведение этого явления, которое я могу исследовать на своем Linux-сервере, - это два новых файла, которые появляются в определенном месте, но с переменными именами файлов (они зависят от времени и имеют отметку времени в своем имени). Думаю, это какой-то дамп памяти или трассировки стека, которые изначально следует использовать для отправки отчета об ошибке.
Итак, теперь я ищу решение для systemd, чтобы захватить это решение, например
Я думал об оболочке, написанной на bash или чем-то подобном, но есть две проблемы: во-первых, я не знаю, как реализовать это поведение, и во-вторых , это сделало бы использование systemd полностью устаревшим, поскольку сценарий обрабатывает всю обработку сбоев, а systemd будет выполнять только сценарий.
Я также думал о том, чтобы просто периодически перезапускать демон с указанными функциями systemd, но это было бы довольно неэффективно (учитывая тот факт, что демон Windows в винной оболочке не t неэффективен в первую очередь), поскольку он иногда перезапускал демон, когда в этом нет необходимости, или после сбоя демона требовалось некоторое время, пока не сработает периодический перезапуск.
Какое было бы лучшее решение для решения этой проблемы ?
И только для справки: демон, о котором я говорю, - это Загрузчик для Google Фото. Google по какой-то причине не выпускает его для Linux.
Хорошо, я обнаружил мощь systemd.path.
Я создал вторую служебную единицу с помощью ExecStart = systemctl restart daemon.unit
и Type = oneshot
. После этого я создал третий модуль, модуль пути с PathModified = <выходной каталог аварийного дампа>
и Unit = daemon-restart.unit
.
Теперь он работает. Мне нужно только убедиться, что никакой другой процесс не записывает в выходной каталог, но это можно решить с помощью нескольких разных винных префиксов.
Я думаю, ваша проблема в том, что ваша программа может давать сбой, а 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
Основная логика:
Я не говорю, что это отличное решение, но это может быть решением