Порядок зупинки VPN- і проксі-служб у Linux
Зупиняйте споживача, поки шлях ще існує, потім проксі, а потім тунель — через його власника. Використовуйте ExecStop і TimeoutStopSec усвідомлено, а не масове вбивство процесів.
Зависання під час зупинки, коли працює проксі, рідко буває помилкою VPN, навіть якщо VPN — останнє, що видно на екрані. Застосунки за проксі все ще чекають на шлях, який от-от зникне, а юніт, що володіє тунелем, ще не отримав команди закрити його. Те, що виглядає як повільна служба, зазвичай є проблемою порядку. Упорядкування вирішує більше таких випадків, ніж будь-яка зміна тайм-ауту.
Рухайтеся назовні у зворотному порядку: спочатку споживачі, потім проксі, потім тунель — кожен зупиняє той компонент, який його запустив.
Складіть список юнітів, перш ніж щось зупиняти
Запишіть юніт застосунку, юніт проксі та власника VPN, задіяних у звичайному запуску. Додайте будь-який резолвер або допоміжний компонент із власним завершенням, бо саме їх забувають о другій годині ночі. Без цього списку перша ж команда зупинки, яку ви введете, обере жертву навмання.
Імена — слабкий доказ. Користувацький проксі, системний проксі та тунель іншого облікового запису можуть мати однакову назву, але цілком не пов'язані життєві цикли.
Спочатку завершіть роботу, потім зупиніть споживача
Планова зупинка починається із застосунку: дайте йому завершити або скасувати свої запити, потім зупиніть проксі через юніт його служби. Якщо застосунок має й надалі працювати після зникнення тунелю, організуйте це навмисно, а не залишайте його прив'язаним до маршруту, який от-от зникне.
Запити, що були в польоті під час зупинки, мають потрапити до запису, бо саме звідти береться шторм повторних спроб під час наступного запуску.
ExecStop і ExecStopPost — різні інструменти
ExecStop= — це синхронна операція зупинки; ExecStopPost= — це очищення, яке виконується навіть після невдалого запуску. Команда зупинки, яка лише надсилає сигнал процесу й повертає керування, дозволяє systemd рухатися далі, поки споживач ще скидає дані. Те, що має відбутися за будь-яких умов, належить до пост-варіанта, а те, що має блокувати зупинку, — до синхронного. Перевіряйте чинний юніт та його drop-in-файли, а не правте файл пакунка на місці.
Граф залежностей упорядковує завдання зупинки. Він не перетворює асинхронний скрипт на синхронний і не змушує віддалений застосунок зафіксувати свої дані.
Обмежте зупинку й знайте ціну цього обмеження
TimeoutStopSec= обмежує і команду зупинки, і власне завершення служби, а після вичерпання ліміту systemd переходить до примусового вбивства. Обирайте значення за реальною поведінкою застосунку під час скидання даних і записуйте, що може бути втрачено, коли ліміт спрацює. Число, обране тому, що машина має вимкнутися швидше, — це налаштування втрати даних під іншою назвою.
Коли зупинка все ще повільна, зафіксуйте юніт, його дочірні процеси, інтервал журналу та результат тайм-ауту. Скорочення всіх тайм-аутів або хватаня за масове вбивство — саме так чисті зупинки перетворюються на пошкоджений стан під час наступного завантаження.
Відключайтеся через власника, потім перевірте три випадки
Коли споживачі зупинені, попросіть менеджер, що володіє тунелем, відключитися: екземпляр systemd, активне з'єднання NetworkManager або службу постачальника. Убивство стороннього процесу OpenVPN не обов'язково видаляє сесію, яка надала маршрут, а проксі з політикою перезапуску може створити запит заново, поки ви розбираєте шлях. Узгодьте цю політику з плановою зупинкою до початку.
Перевірте звичайну зупинку, зупинку з активним запитом і зупинку, у якій тунель відмовляє першим. Повторювана послідовність із крайнім терміном краща за швидке вимкнення, яке спрацьовує один раз.