¿Puedo usar un enlace simbólico como servicio de systemd?

14

Por ejemplo, tengo un servicio nombrado mysshd.serviceen el /usr/lib/systemd/system/directorio. ¿Puedo crear un enlace simbólico como:

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

para que cualquier operación que haga con fool.service se refleje en mysshd.service( systemctl enable/disable start/stop fool.servce)?

Mi propósito es sobrescribir el servicio sshd nativo mediante un enlace simbólico de mi propio servicio sshd.

mella
fuente
1
¿Por qué no agrega y habilita su servicio y deshabilita el servicio sshd nativo?
Lambert
Quiero que mi software sea compatible con la versión anterior que usaba un enlace simbólico /etc/init.d/ssh -> /etc/init.d/myssh.
nick
Todavía no entiendo exactamente lo que quiere decir, pero de acuerdo con su línea <quote> para que cualquier operación que haga con fool.service se refleje en mysshd.service (systemctl enable / disable start / stop fool.servce)? </ Quote > puede echar un vistazo a las dependencias systemd (consulte wiki.archlinux.org/index.php/systemd#Handling_dependencies ) para iniciar / habilitar su servicio después de sshd.
Lambert
@nick bienvenido a Stack Exchange! en Stack Exchange es costumbre mostrar felicitaciones por las respuestas al votar. puede hacerlo haciendo clic en la flecha hacia arriba a la izquierda de la respuesta. Si mi respuesta resolvió su problema, también puede considerar hacer clic en la casilla de verificación para marcarlo como aceptado. ¡Gracias!
strugee

Respuestas:

9

Hasta donde yo sé, systemd no se ocupará de esto particularmente bien. Según tengo entendido, desea anular el comportamiento de sshd.service, ¿verdad?

Afortunadamente para ti, systemd está diseñado para este tipo de cosas. Simplemente ingrese su definición de servicio /etc/systemd/system/ssh.service, ejecútelo systemctl daemon-reloadpara recargar los archivos de la unidad, y systemd usará automáticamente esa configuración en lugar del sistema ssh.service.

¿Quieres tener systemctl enable mysshd.servicetrabajo también? No hay problema. En la [Install]sección del archivo de su unidad, agregue una línea que diga Alias=mysshd.service. Luego ejecute systemctl reenable ssh.servicepara que systemd arregle los enlaces simbólicos de la unidad, y estará dorado.

Ahora, no ha dado detalles sobre lo que mysshd.servicese supone que debe hacer. Si es completamente diferente de lo normal ssh.service, ¡genial! Usa el método anterior. Sin embargo, si solo desea cambiar una pequeña cosa, está utilizando el enfoque incorrecto. systemd le permite crear "fragmentos" de archivos de la unidad que se aplicarán sobre los archivos de la unidad normal. Esto le permite agregar o anular directivas individuales mientras permite que el resto del archivo de la unidad reciba actualizaciones del administrador de paquetes. Para hacer esto, simplemente cree /etc/systemd/system/ssh.d/my-custom-config.conf(puede cambiar my-custom-config.confpara que sea lo que quiera, y también puede tener múltiples archivos de anulación). En ese archivo, coloque las directivas que desee cambiar o agregar a las habituales ssh.service. Incluso puede agregar Alias=directivas, ¡eso systemctl start mysshd.servicefunciona! Solo recuerda ejecutarsystemctl daemon-reloaddespués de que haya terminado (y, si se ha utilizado Alias=, systemctl reenable ssh.service).

Como un aparte, nunca, nunca cambie los archivos de la unidad systemd /usr/lib/systemd. ¡Nunca! El estándar de jerarquía del sistema de archivos requiere que /usrse trate como de solo lectura. En la práctica, esto significa que el administrador de paquetes maneja /usr(excepto /usr/local), y no toca lo que maneja el administrador de paquetes, especialmente porque lo que cambie probablemente se sobrescribirá. En cambio, pon tus cosas en algún lugar como /etc.

Strugee
fuente
1
Para aclararlo un poco: si desea anular foo.service, ejecute sudo systemctl edit foo.servicey guardará lo que haya escrito /etc/systemd/system/foo.service.d/override.conf.
Rockallite
Además, la Alias=directiva NO funciona en archivos de anulación. Ver github.com/systemd/systemd/issues/1090
Rockallite
@Rockallite no sabía systemctl editcuando escribí esta respuesta. no dudes en editar mi respuesta para reflejar el Alias=error (pon "OK with answerer" o algo en el mensaje de edición). buena atrapada.
Strugee
5

Usar linkcon la ruta completa:

systemctl link /home/nick/myservice.service

Tenga en cuenta que no puede vincular un archivo de servicio que en sí mismo ya sea un enlace.

Gunar Gessner
fuente