vmware.service зависает во время выключения

В Arch Linux, начиная с нескольких обновлений системы (к сожалению, я не могу сказать, какие), vmware.service зависает во время выключения / перезагрузки.

Я обнаружил, что если я вручную остановлю эту службу ( systemctl stop vmware.service ), пока gdm.service все еще работает (т. gdm.service От терминала Gnome), служба быстро остановится и завершение работы будет таким же быстрым, как ожидалось. Я googled вокруг и обнаружил, что также на Fedora 21 есть аналогичная проблема, и один пользователь перешел на lightdm, чтобы исправить это. Я не хочу переключаться на lightdm, поэтому мне интересно, есть ли способ сказать systemd остановить vmware.service прежде чем остановить gdm.service . Или, если у кого-то есть работа для этого …

Конечно, есть способ. systemd поддерживает задание так называемых «зависимостей заказа» между парами единиц, которые делают systemd следовать определенному взаимному упорядочению, когда эти блоки активируются / дезактивируются в одной транзакции.

Из systemd.unit (5) :

Before =, After =

Список имен объектов, разделенных пробелами. Настраивает зависимости заказа между единицами. Если единица foo.service содержит параметр Before = bar.service, и оба устройства запускаются, запуск bar.service задерживается до запуска foo.service. <…> Обратите внимание, что, когда два блока с зависимостями упорядочения между ними закрываются, применяется обратное порядку запуска. т.е. если блок сконфигурирован с After = на другом блоке, первый останавливается перед последним, если оба они выключены. <…>

Таким образом, вы хотите, чтобы vmware.service был отключен (остановлен) до того, как gdm.service остановлен. В соответствии с вышеизложенным может быть достигнуто путем добавления зависимостей порядка After=gdm.service к vmware.service .

Чтобы избежать копирования всего устройства в систему /etc/systemd/system , вы можете использовать механизм выпадающих списков (см. «Пример 2»). Вам нужно создать файл с именем /etc/systemd/system/vmware.service.d/<some name>.conf с только необходимыми директивами и заголовками разделов:

 [Unit] After=gdm.service 

После этого выпустите systemctl daemon-reload чтобы система перечитала единицы. При завершении работы новый список зависимостей должен стать эффективным.