На Debian 8 я развернул свое приложение, состоящее из нескольких небольших приложений, одно из которых использует HDF5 файл. Проблема с HDF5
файлы это то, что вы иметь чтобы закрыть их. Если, например, вы запрограммируете chrases или ваша программа будет убита, HDF5
файлы повреждаются. В зависимости от размера HDF5
файл, закрытие может занять несколько секунд.
У меня есть инструмент mondas_ctrl
который является менеджером моих приложений, их структура здесь не важна. При входе в систему (через ssh) я могу выполнить mondas_ctrl start
или mondas_ctrl stop
без проблем, особенно стоп команда знает, как бороться с HDF5
файлы (добавляя задержки между ними).
Со старым SysV я мог отложить процесс остановки, изменив уровень выполнения 6 на /etc/inittab
с самописным скриптом, который позаботился о файлах HDF5, прежде чем делать init 0
. Сейчас systemd
по умолчанию, и мне пришлось изменить то, как я думаю о init.d
файлы и сервисы. Итак, я написал пользовательскую службу, которая использует моего менеджера для запуска и остановки моих приложений:
Файл: ~/.config/systemd/user/mondas.service
[Unit]
Description=Mondas
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/home/mondas/anaconda/default/bin/mondas_ctrl start
ExecRestart=/home/mondas/anaconda/default/bin/mondas_ctrl restart
ExecStop=/home/mondas/anaconda/default/bin/mondas_ctrl stop
KillMode=none
[Install]
WantedBy=default.target
Сначала у меня были небольшие проблемы с стоп команда. После читая эту ветку Я добавил Type
, RemainAfterExit
и KillMode
параметры. Это очень помогло, и теперь я могу это сделать:
$ systemctl --user start mondas
$ systemctl --user stop mondas
$ systemctl --user start mondas
столько раз, сколько я хочу, стоп команда ничего не убивает, мой mondas_ctrl
менеджер останавливает HDF5
app, файл закрыт и не поврежден.
Но когда я перезагружаю систему (либо выполняя reboot
или shutdown -r now
), KillMode
кажется, что флаг игнорируется или вся служба кажется пропущенной, журналы на экране проходят так быстро, что я не могу сказать, выполняется ли моя служба вообще.
Итак, вопрос в том, ведут ли службы "остановки" по-разному, когда вы выполняете systemctl stop
и когда вы выполняете reboot/shutdown -r now
? Если да, то что мне нужно сделать во время перезагрузки, чтобы у моего приложения было достаточно времени, чтобы закрыть HDF5
файл?
Спасибо
На unix.stackexchange есть отличный ответ, который я рекомендую вам прочитать, чтобы полностью понять, как работает systemd и как решить вашу проблему. Вы можете найти это здесь : https://unix.stackexchange.com/questions/211924/effect-of-reboot-signal-on-systemd-service-state
Надеюсь, это поможет вам!