Назад | Перейти на главную страницу

Порядок остановки служб Linux при перезагрузке / завершении работы

На виртуальной машине KVM под управлением Centos 7.5 у меня работает служба, которая выполняет запись в файловую систему, смонтированную по NFS. Когда выполняется завершение работы или перезагрузка, служба генерирует исключение, которое указывает, что у нее нет разрешения на запись в каталог, расположенный в этой файловой системе NFS. Если вместо этого я вручную остановлю службу с помощью systemctl, служба завершится нормально, т.е. исключение не будет создано. Из-за исключения я предполагаю, что до того, как моя служба сможет записать свои окончательные данные в монтирование NFS, ОС отключает службу NFS, удаляя, таким образом, смонтированный том. Когда служба пытается записать в это место, она не может, потому что каталог отсутствует. Удаляются ли монтирования NFS до того, как пользовательские службы будут остановлены?

Что странно в этом, так это то, что у меня есть две версии виртуальной машины. У этого, у которого есть проблема, есть корневой раздел, зашифрованный LUKS. Другая виртуальная машина имеет тот же код, но работает на незашифрованном разделе. ОС одинаковая на обоих. Я не понимаю, почему это может стимулировать эту проблему, но это единственное отличие виртуальных машин.

Есть ли способ гарантировать, что моя служба будет выполнена до того, как NFS будет уничтожен?

Systemd по возможности запускает и останавливает службы параллельно. Вот как ему удается делать и то, и другое так быстро по сравнению с предустановленными дистрибутивами Linux. Когда службе требуется какая-либо другая служба или ресурс, это необходимо явно объявить в файле модуля этой службы, чтобы systemd могла правильно их упорядочить. Без этого вы не сможете надежно предсказать, станет ли ресурс, необходимый вашей службе, недоступным, пока ваша служба все еще пытается его использовать.

В вашем конкретном случае вы можете использовать RequiresMountsFor= чтобы указать, что устройству нужна файловая система, смонтированная в данной точке монтирования. Это идет в [Unit] раздел.

[Unit]
RequiresMountsFor=/path/to/mountpoint

Если это объявлено, ваша служба не запустится, пока файловая система не будет смонтирована в этой точке монтирования, и будет остановлена ​​перед размонтированием файловой системы.