在 Debian 8 上,我部署了一个由几个较小的应用程序组成的应用程序,其中一个较小的应用程序使用HDF5文件。文件的问题HDF5
在于你有关闭它们。例如,如果您编写了脚本或您的程序被终止,则HDF5
文件会损坏。根据文件的大小HDF5
,关闭它可能需要几秒钟。
我有一个工具mondas_ctrl
可以管理我的应用程序,它们的结构在这里并不重要。登录后(通过 ssh),我可以毫无问题地执行mondas_ctrl start
或执行,特别是mondas_ctrl stop
停止命令知道如何处理HDF5
文件(通过在中间添加延迟)。
使用旧的 SysV,我能够通过使用/etc/inittab
自写脚本更改运行级别 6 来延迟停止过程,该脚本在执行之前会处理 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
应用程序,文件被关闭并且没有被损坏。
但是,当我进行系统范围的重启(通过执行reboot
或shutdown -r now
)时,KillMode
标志似乎被忽略或整个服务似乎被跳过,屏幕上的日志传递得如此之快,我无法判断我的服务是否被执行。
所以问题是,"停止"服务在执行时systemctl stop
和执行时的行为是否不同reboot/shutdown -r now
? 如果是这样,我在重启期间必须做什么才能让我的应用程序有足够的时间关闭文件HDF5
?
谢谢
答案1
unix.stackexchange 上有一个很好的答案,我建议你阅读一下,以便充分了解 systemd 的工作原理以及如何解决你的问题。你可以在这里找到它:https://unix.stackexchange.com/questions/211924/effect-of-reboot-signal-on-systemd-service-state
希望这可以帮到你 !