Включение «связанных» файлов модулей в Systemd

10

Я все еще сталкиваюсь с systemd и столкнулся с чем-то. Это не такая большая проблема, но я хотел бы узнать больше о том, как это происходит. Я не мог найти ссылку на это в другом месте.

Прежде всего, я понимаю, что файлы пользовательских модулей для сервисов должны войти /etc/systemd/system. Тем не менее, было бы неплохо для управления нашими серверами, если файлы модуля могут быть расположены в другом месте.

В документации я видел, что вы можете «связать» файлы модулей следующим образом:

systemctl link /path/to/servicename.service

Это создаст ссылку на выше в /etc/systemd/system. Теперь вы можете запускать / останавливать эту услугу. На первый взгляд это показалось нам хорошим способом управления нашими услугами.

Однако попытка включить такой «связанный» файл модуля приводит к сбою:

root@test1:/etc/systemd/system# systemctl link /root/myservice.service 
Created symlink from /etc/systemd/system/myservice.service to /root/myservice.service.

root@test1:/etc/systemd/system# systemctl status myservice.service 
 * myservice.service - My Test Service
     Loaded: loaded (/root/myservice.service; linked; vendor preset: enabled)

root@test1:/etc/systemd/system# systemctl enable myservice.service
Failed to execute operation: No such file or directory

Используя точно такой же файл модуля, но скопированный /etc/systemd/systemвместо ссылки, вы получите:

root@test1:/etc/systemd/system# cp -p /root/myservice.service .

root@test1:/etc/systemd/system# systemctl daemon-reload 

root@test1:/etc/systemd/system# systemctl status myservice.service 
 * myservice.service - My Test Service
     Loaded: loaded (/etc/systemd/system/myservice.service; disabled; vendor preset: enabled)

root@test1:/etc/systemd/system# systemctl enable myservice.service
Created symlink from /etc/systemd/system/multi-user.target.wants/myservice.service to /etc/systemd/system/myservice.service.

Исходя из этого, кажется, что невозможно включить вызов связанных файлов модулей при запуске системы.

Если это так, в чем смысл функциональности «ссылка»? Из документов сказано:

ссылка FILENAME

Свяжите файл модуля, который отсутствует в путях поиска файла модуля, в путь поиска файла модуля. Это требует абсолютного пути к файлу модуля. Эффект этого можно отменить с отключением. Результатом этой команды является то, что файл модуля доступен для запуска и других команд, хотя он не установлен непосредственно в пути поиска модуля.

Tom17
источник

Ответы:

13

Страница man вводит в заблуждение.

systemctl link /root/myservice.service

systemctl enable /root/myservice.service

Первое позволяет вам сделать systemctl start myservice. Второй позволяет myserviceавтоматически запускаться (который, как указал @Julien, автоматически добавляет link).

Я думаю ... Я пытался обернуть голову вокруг этого весь день.

Прорицание
источник
1
обратите внимание, что systemctl enableэто тоже подойдет systemctl link, поэтому не нужно вводить 2 команды ;-)
Julien
@Julien О, где мы с тобой, когда я написал это в прошлом году :-) Я думаю, я наконец понял, что в прошлом месяце!
Auspex
9

При включении службы по другому пути, чем пути по умолчанию, вы должны использовать полный путь. Включить также создаст ссылку для вас:

systemctl enable /root/myservice.service

После включения вы можете запустить / остановить / статус с именем службы

systemctl start myservice

Несколько предостережений здесь:

  • вы не можете включить служебный файл, который уже сам по себе является ссылкой
  • убедитесь, что путь находится на том же смонтированном диске. Если это не так, systemd не сможет загружать файлы служебного блока при загрузке, поскольку диск еще не будет подключен и файлы не будут найдены. (см. Файлы связанных модулей Systemd на смонтированном диске не загружаются )
  • из-за ошибки в systemd нельзя включить экземпляры из файла модуля, который находится по нестандартному пути (см. https://github.com/systemd/systemd/issues/661 )
nickvane
источник