Могу ли я использовать символическую ссылку в качестве службы systemd?

14

Например, у меня есть служба с именем mysshd.serviceв /usr/lib/systemd/system/каталоге. Могу ли я создать символическую ссылку, такую ​​как:

ln -s /usr/lib/systemd/system/mysshd.service /usr/lib/systemd/system/fool.service

так что любая операция, которую я делаю с fool.service, будет отражена в mysshd.service( systemctl enable/disable start/stop fool.servce)?

Моя цель - переписать нативный сервис sshd с помощью символической ссылки моего собственного сервиса sshd.

Ник
источник
1
Почему бы не добавить и не включить свой сервис и не отключить собственный сервис sshd?
Ламберт
Я хочу, чтобы мое программное обеспечение было совместимо с предыдущей версией, которая использовала символическую ссылку /etc/init.d/ssh -> /etc/init.d/myssh.
Ник
Я до сих пор не совсем понимаю, что вы имеете в виду, но в соответствии с вашей строкой <quote>, чтобы любая операция, которую я делаю с fool.service, была отражена в mysshd.service (systemctl enable / disable start / stop fool.servce)? </ Quote > вы можете взглянуть на зависимости systemd (см. wiki.archlinux.org/index.php/systemd#Handling_dependencies ) для запуска / включения вашего сервиса после sshd.
Ламберт
@nick добро пожаловать в Stack Exchange! на бирже стека принято ставить оценку за ответы путем голосования. Вы можете сделать это, нажав на стрелку вверх слева от ответа. если мой ответ решил вашу проблему, вы можете также нажать на флажок, чтобы пометить его как принятый. Благодарность!
Струге

Ответы:

9

Насколько я знаю, systemd не справится с этим особенно хорошо. Как я понимаю, вы хотите изменить поведение sshd.service, верно?

К счастью для вас, systemd предназначен для такого рода вещей. Просто введите определение службы /etc/systemd/system/ssh.service, выполните systemctl daemon-reloadперезагрузку для файлов модулей, и systemd автоматически использует эту конфигурацию вместо системы ssh.service.

Хотите тоже systemctl enable mysshd.serviceработать? Нет проблем. В [Install]разделе вашего файла модуля добавьте строку с надписью Alias=mysshd.service. Затем выполните systemctl reenable ssh.serviceкоманду systemd, чтобы исправить символьные ссылки, и все будет отлично.

Теперь вы не дали подробностей о том, что mysshd.serviceпредполагается делать. Если он полностью отличается от нормального ssh.service, отлично! Используйте метод выше. Однако, если вы просто хотите изменить одну маленькую вещь, то вы используете неправильный подход. systemd позволяет вам создавать «фрагменты» файлов модулей, которые будут применяться поверх обычных файлов модулей. Это позволяет добавлять или переопределять отдельные директивы, а остальная часть файла модуля получать обновления от менеджера пакетов. Для этого просто создайте /etc/systemd/system/ssh.d/my-custom-config.conf(вы можете изменить, my-custom-config.confчтобы быть тем, что вы хотите, и вы также можете иметь несколько файлов переопределения). В этом файле поместите все директивы, которые вы хотите изменить или добавить к обычным ssh.service. Вы даже можете добавить Alias=директивы, так что это systemctl start mysshd.serviceработает! Просто не забудьте выполнитьsystemctl daemon-reloadпосле того, как вы сделали (и, если вы использовали Alias=, systemctl reenable ssh.service).

Кроме того, никогда не меняйте системные файлы модулей в /usr/lib/systemd. Когда-либо! Стандарт иерархии файловой системы требует, чтобы /usrон обрабатывался только для чтения. На практике это означает, что менеджер пакетов обрабатывает /usr(кроме /usr/local), и вы не трогаете то, что обрабатывает менеджер пакетов - особенно потому, что все, что вы измените, вероятно, в конечном итоге будет перезаписано. Вместо этого поместите свои вещи куда-нибудь как /etc.

strugee
источник
1
Чтобы уточнить это немного: если вы хотите переопределить foo.service, запустите sudo systemctl edit foo.service, и он сохранит все, что вы набрали /etc/systemd/system/foo.service.d/override.conf.
Rockallite
Кроме того, Alias=директива НЕ работает в переопределенных файлах. См github.com/systemd/systemd/issues/1090
Rockallite
@Rockallite не знал о systemctl editтом, когда я написал этот ответ. не стесняйтесь редактировать мой ответ, чтобы отразить Alias=ошибку (поставьте «ОК с ответчиком» или что-то в сообщении редактирования). хороший улов.
стружка
5

Используйте linkс полным путем:

systemctl link /home/nick/myservice.service

Обратите внимание, что вы не можете связать служебный файл, который сам по себе уже является ссылкой.

Гунар Гесснер
источник