Что-то постоянно запускает юнит OpenVPN: найдите источник
Отключение юнита — не то же самое, что удаление его активации. Прочитайте экземпляр, сопоставление шаблона и обратные зависимости, прежде чем удалять профиль.
Экземпляр OpenVPN появляется при загрузке под именем, которое вы не узнаёте, и остановка работает до следующей перезагрузки. Этот шаблон означает, что вы удалили процесс, но не активацию. Это два разных объекта, и только один из них виден на экране состояния. Чтобы найти активацию, нужны четыре команды только для чтения и одно решение.
Сначала назовите точный юнит
Отталкивайтесь от имени юнита в journal, а не от имени файла профиля. Экземпляр может называться openvpn@, openvpn-client@, openvpn-server@ или как-то специфично для дистрибутива, и угадывание имени ведёт вас к неправильному шаблону. Вывод состояния называет юнит, который действительно работал, и это единственное имя, которое здесь важно. Скопируйте его точно, включая любой суффикс.
Следующие команды описывают этот юнит, ничего не меняя. systemctl show сообщает путь фрагмента, путь источника, состояние файла юнита, любые drop-in и что его активировало. list-dependencies --reverse показывает, какие загруженные юниты указывают на него. Обе только для чтения, поэтому выполните их, прежде чем строить теорию.
Заменяйте наблюдаемое имя везде. Скопированное примерное имя — самый частый способ исследовать не ту службу, и оно даёт уверенные ответы о юните, который никогда не работал.
Прочитайте шаблон, чтобы узнать имя файла
Юнит экземпляра — это расширение шаблона, и шаблон решает, какой файл конфигурации он читает. Строка команды, оканчивающаяся подстановочным знаком для экземпляра, разворачивается в имя экземпляра плюс суффикс. Если суффикс .conf, а экземпляр называется old, файл — old.conf. Если назвать экземпляр old.conf, тот же шаблон потребует old.conf.conf.
Эта деталь объясняет класс дубликатов. Кто-то добавляет второй экземпляр под неправильным именем, первый продолжает работать, и хост остаётся с двумя туннелями и одним запутанным журналом.
Читайте действующий шаблон, а не файл, который вы помните как отредактированный. Drop-in может заменить строку команды, и при загрузке работает именно замена.
Проследите, как он попадает в транзакцию загрузки
Три пути обычны: wants-связь от цели, требование от другого юнита или сгенерированный юнит от генератора пакета. Список обратных зависимостей охватывает первые два как загруженные записи графа. Он не охватывает таймер, hook или внешний запрос, поэтому список — доказательство, а не полный аудит.
Сгенерированный вывод в /run/systemd/generator — это продукт, а не источник. Его редактирование живёт только до следующей генерации, поэтому исправление, применённое там, выглядит успешным и затем откатывается.
Проверьте документированный вход пакета, прежде чем предполагать, откуда читает генератор. Недокументированное сканирование каталога — обычная причина появления юнита без связи активации.
Удалите активацию, а не только процесс
Если экземпляр включён напрямую и действительно устарел, systemctl disable --now останавливает его и убирает связь загрузки за один шаг. Сначала проверьте, что этот туннель не единственный ваш административный путь к хосту. Команда — пример жизненного цикла, а не предложение остановить каждый VPN на машине. Выполните проверку до команды, а не после.
Две половины разделимы и часто путаются. Отключение не останавливает работающую службу, а остановка не убирает активацию, поэтому частичная команда объясняет проблему, которая возвращается при загрузке.
Отключённый юнит всё ещё может быть запущен другим юнитом или явным запросом. Когда активацией владеет генератор, исправьте его вход, а не отключайте его вывод. Маскирование блокирует больше путей, но может сломать зависимости, поэтому оно не заменяет понимания.
Проверьте перезагрузкой, а не экраном состояния
Перезагрузите systemd, если изменились определения юнитов или входы генератора, затем осмотрите получившееся состояние. Перезагрузка демона не проталкивает новый профиль в работающий туннель, поэтому две проверки раздельны. Запланируйте перезагрузку и подтвердите, что экземпляр остаётся отсутствующим, пока нужный туннель по-прежнему работает.
Держите старый профиль, пока его принадлежность не станет понятна, затем выведите его из эксплуатации предусмотренным процессом. Успех — это отсутствующий юнит и работающий путь доступа, а не проваленный юнит, которого нет на одном экране.