在Debian 8上,我部署了一个由几个小应用程序组成的应用程序,其中一个小应用程序使用HDF5文件。 HDF5文件的问题是你必须closures它们。 例如,如果你编程的程序片断或你的程序被杀死, HDF5文件被损坏。 根据HDF5文件的大小,closures它可能需要几秒钟的时间。
我有一个工具mondas_ctrl这是我的应用程序的pipe理器,他们的结构在这里并不重要。 login(通过SSH)我可以执行mondas_ctrl start或mondas_ctrl stop没有问题,特别是停止命令知道如何处理HDF5文件(通过添加延迟之间)。
使用旧的SysV,我可以通过改变/etc/inittab上的运行级别6来延迟暂停进程,这是一个自写的脚本,它在执行init 0之前负责照顾HDF5文件。 现在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_ctrlpipe理器停止HDF5应用程序,该文件被closures,并没有被损坏。
但是当我做一个系统范围的重新启动(无论是通过执行reboot或shutdown -r now ), KillMode标志似乎被忽略或整个服务似乎被跳过,屏幕上的日志过得很快,我不能告诉我是否我的服务被执行。
所以问题是,执行systemctl stop和执行reboot/shutdown -r now时,“停止”服务的行为是否有所不同? 如果是这样,在重新启动过程中我需要做些什么,以便我的应用程序有足够的时间来closuresHDF5文件?
谢谢
unix.stackexchange有一个很好的答案,我build议你阅读以充分理解systemd是如何工作的,以及如何解决你的问题。 你可以在这里find它: https : //unix.stackexchange.com/questions/211924/effect-of-reboot-signal-on-systemd-service-state
希望这可以帮到你 !