No puedo encontrar la forma correcta de ejecutar algunos scripts locales (o comandos muy locales) en systemd, ya sé que no debo crear un servicio (en systemd una unidad) para este tipo de scripts (¿o debo hacerlo?) ...
La solución que encontré es crear rc.local y darle permisos de ejecución.
printf '#!/bin/bash \n\nexit 0' >/etc/rc.local
chmod +x /etc/rc.local
Por ejemplo, si obtengo un servidor heredado con un simple rc.local configurado por usted, sabré qué hizo y cuánto me va a doler actualizar o instalar algo nuevo en la distribución, ya que rc.local fue respetado por externos paquetes, pero por otro lado si instalo un servidor y creo una unidad systemd o dos o tres (o incluso servicios sysvinit), solo por hacer una tarea simple, esto a veces puede hacer su vida más difícil, y mucho más que esto mis unidades algún día, los nombres pueden entrar en conflicto con los nombres de los nuevos servicios creados por el desarrollo de la distribución, y tal vez instalados en una actualización, causando problemas a mis scripts.
Veo otra pregunta sobre dónde está rc.local y la respuesta fue crearlo y otorgar permisos de ejecución, creo que mi pregunta realmente no es un duplicado , porque no quiero saber dónde está, créeme, solo quiero para aceptar que está en desuso , pero no puedo encontrar la forma correcta de hacer este tipo de cosas, ¿realmente debería crear una unidad para algo así de simple?
Respuestas:
Como se señaló en otra parte, se vuelve moderadamente impuro usar
rc-local.service
debajosystemd
.poweroff
/reboot
comandos que mucha gente usa).rc-local.service
una forma, pero Debian proporciona un archivo desplegable que modifica al menos una configuración importante.rc-local.service
A menudo puede funcionar bien. Si le preocupa lo anterior, ¡todo lo que necesita hacer es hacer su propia copia! Aquí está la magia:No creo que necesite comprender cada detalle [*], pero hay dos cosas que debe saber aquí.
Necesita habilitar esto con
systemctl enable my-startup.service
.Si su script tiene una dependencia de cualquier otro servicio, incluido
network-online.target
, debe declararlo. Por ejemplo, agregue una[Unit]
sección, con las líneasWants=network-online.target
yAfter=network-online.target
.No necesita preocuparse por las dependencias de los servicios de "arranque temprano", específicamente, los servicios que ya se ordenaron anteriormente
basic.target
. Los servicios comomy-startup.service
se ordenan automáticamente despuésbasic.target
, a menos que se establezcanDefaultDependencies=no
.Si no está seguro de si una de sus dependencias es un servicio de "arranque temprano", un enfoque es enumerar los servicios que se ordenaron antes
basic.target
, ejecutándosesystemctl list-dependencies --after basic.target
. (Tenga en cuenta que--after
no--before
).Hay algunas consideraciones que creo que también se aplicaron a pre-systemd
rc.local
:rc.local
.[*] Utilicé
Type=oneshot
+RemainAfterExit=yes
porque tiene más sentido para la mayoría de los scripts de una sola vez. Se formaliza que ejecutará una serie de comandos, quemy-startup
se mostrarán como "activos" una vez que se hayan completado, y que no iniciará un demonio.fuente
.service
unidad de sistema nativa , o si realmente desea escribir un script de inicio LSB, puede hacerlo en su lugar. No quería recomendar poner varios demoniosrc-local.service
o equivalentes, creo que probablemente funcione, pero parece mucho mejor si puedes reiniciar el demonio individual consystemctl restart my-daemon
cualquier otra cosa. Está destinado a poner sus servicios locales/etc/systemd/system
.local-
...Type=oneshot
... formaliza que ... no iniciarás un demonio. Si desea información sobre cómo iniciar un demonio, haga una nueva pregunta.Olvidarse de
rc.local
.Como dije sobre CentOS 7 y sobre Debian 8 y sobre Ubuntu 15 :
Estás utilizando un sistema operativo systemd + Linux.
/etc/rc.local
es un doble mecanismo de compatibilidad con versiones anteriores en systemd, porque es un mecanismo de compatibilidad con versiones anteriores para un mecanismo que era en sí mismo un mecanismo de compatibilidad en el clon del Sistema 5 de Van Smoorenburgrc
.Usar
/etc/rc.local
puede salir terriblemente mal. La gente se ha sorprendido por el hecho de que systemd no se ejecutarc.local
de la misma manera, en el mismo lugar en el arranque, como solía hacerlo. (O erróneamente espere: de hecho, no se ejecutó por última vez en el sistema anterior, como todavía señala el manual de OpenBSD). Otros se han sorprendido por el hecho de que lo que establecieron alrc.local
esperar las viejas formas de hacer las cosas, es entonces completamente deshecho por los gustos de las nuevasudev
normas, NetworkManager,systemd-logind
,systemd-resolved
, o varios "kit" s.Como se ejemplifica en " ¿Por qué` init 0` resulta en "Argumentos excesivos" en la instalación de Arch? ", Algunos sistemas operativos ya proporcionan systemd sin las características de compatibilidad con versiones anteriores , como el
systemd-rc-local-generator
generador . Mientras Debian aún conserva las características de compatibilidad con versiones anteriores , Arch Linux construye systemd con ellas desactivadas . Entonces, en Arch y sistemas operativos como este, se espera/etc/rc.local
que se ignore por completo .Olvidarse de
rc.local
. No es el camino a seguir. Tiene un sistema operativo systemd + Linux. Por lo tanto, cree una unidad de servicio systemd adecuada y no comience desde un punto que esté a dos niveles de compatibilidad con versiones anteriores. (En Ubuntu y Fedora, se eliminó tres veces, el clon de Van Smoorenburg System 5rc
que siguiórc.local
luego fue reemplazado dos veces , hace más de una década, primero por advenedizo y luego por systemd).Recuerde también la primera regla para migrar a systemd .
Esto ni siquiera es una idea nueva que sea específica de systemd. En los sistemas van Smoorenburg
rc
y Upstart, lo que había que hacer era crear unrc
script de van Smoorenburg o un archivo de trabajo Upstart adecuado en lugar de usarlosrc.local
. Incluso el manual de FreeBSD señala que hoy en día uno crea unrc
script Mewburn adecuado en lugar de usarlo/etc/rc.local
. Mewburnrc
fue presentado por NetBSD 1.5 en 2000./etc/rc.local
data de la época de la Séptima Edición Unix y anteriores. Fue reemplazado/etc/inittab
y basadorc
en un nivel de ejecución en AT&T Unix System 3 (con un poco diferente/etc/inittab
en AT&T Unix System 5) en 1983 . Incluso eso es ahora historia.Cree definiciones de servicio nativas adecuadas para su sistema de gestión de servicios, ya sea un paquete de servicios para el conjunto de herramientas nosh
service-manager
ysystem-control
, un/etc/rc.d/
script para Mewburnrc
, un archivo de unidad de servicio para systemd, un archivo de trabajo para Upstart, un directorio de servicio para runit / s6 / daemontools -encore, o incluso un/etc/init.d/
guión para van Smoorenburgrc
.En systemd, estos archivos de unidad de servicio agregados por el administrador entran
/etc/systemd/system/
generalmente (o/usr/local/lib/systemd/system/
raramente). Con el administrador de servicios nosh,/var/local/sv/
es un lugar convencional para paquetes de servicios locales. Mewburnrc
en los usos de FreeBSD/usr/local/etc/rc.d/
. Sin embargo, los archivos de la unidad de servicio empaquetada y los paquetes de servicio, si los está haciendo, van a diferentes lugares.Otras lecturas
rc.local
. Manual del administrador del sistema FreeBSD . 2016-04-23./etc/rc.local
ochmod -x
se . Error de Redhat # 734268.rc.local
Está empezando a temprano . error systemd # 7703rc.local
. bencane.com./etc/inittab
Es cosa del pasado. . Respuestas frecuentes.systemd.unit
página del manual ". Erratas para systemd doco . Respuestas frecuentes.fuente
Resumen de https://www.linuxbabe.com/linux-server/how-to-enable-etcrc-local-with-systemd
Cree /etc/systemd/system/rc-local.service:
Luego:
Verifícalo con:
fuente
StandardOutput=journal+console
(la consola es equivalente a tty en su ejemplo), lo que parece que sería mucho más útil para la resolución de problemas. TambiénSysVStartPriority=
se ha eliminado el soporte para en algún momento. Tal vez podrías comentar lo importante queSysVStartPriority=
es o eliminarlo. Aparte de eso, es una respuesta decente.