¿Cómo se hace un servicio systemd como último servicio en el arranque?

26

Hace muchos años, podemos escribir nuestro script de inicio /etc/rc.local. Después de cargar todos los servicios del sistema, se ejecutará su secuencia de comandos.

Ahora, usamos systemd, ya no tenemos rc.local. Systemd inicia el servicio en paralelo. Puede escribir su propio servicio para actuar como rc.local` pero no puede asegurarse de que se ejecutará después de que se carguen todos los servicios del sistema.

¿Hay una manera de hacerlo? ¿O tenemos que usar Beforey Afteren el archivo de servicio systemd?

比尔 盖子
fuente
55
¡Systemd, no advenedizo!
比尔 盖子
Especifique el nombre y la versión del sistema operativo?
STTR
SO: Arch Linux, Versión: N / A
比尔 盖子
1
@ 比尔 盖子 ¿Por qué "último", no conoce las dependencias del script, o quiere que dure solo para estar seguro?
Paul

Respuestas:

27

En systemd se recomienda usar Before=y After=ordenar sus servicios muy bien en relación con los demás.

Pero dado que solicitó una forma sin usar Beforey After, puede usar:

Type=idle

que como man systemd.serviceexplica:

El comportamiento de idlees muy similar a simple; sin embargo, la ejecución real del programa de servicio se retrasa hasta que se envíen todos los trabajos activos. Esto puede usarse para evitar el entrelazado de la salida de los servicios de shell con la salida de estado en la consola. Tenga en cuenta que este tipo es útil solo para mejorar la salida de la consola, no es útil como herramienta de pedido de unidad general, y el efecto de este tipo de servicio está sujeto a un tiempo de espera de 5 segundos, después del cual se invoca el programa de servicio de todos modos.

SimonPe
fuente
1
Hola, ¿te importaría elaborar la sintaxis si fuera a usarla antes o después?
r4ccoon
Tema algo diferente, pero si alguien quiere ejecutar procesos de usuario separados de los procesos del sistema, hay askubuntu.com/a/859583/457417
Ben Creasy
funcionó perfectamente para configurar /proc/sys/kernel/modules_disabledal 1final del proceso de arranque
Stuart Cardall
0

Realmente depende de su definición de "arrancado". Supongo que desea que se ejecute inmediatamente después de que comience el getty. Para hacer esto, debe agregar su servicio al /etc/systemd/system/getty.target.wants/directorio. También debe asegurarse de que su archivo esté usando un código similar a los otros servicios en este directorio. Para ejecutar un servicio personalizado en el arranque y apagado (solo suena el zumbador de mi placa base), uso el siguiente script en/etc/systemd/system/getty.target.wants/service_name.service

[Unit]
After=systemd-user-sessions.service plymouth-quit-wait.service
After=rc-local.service
Before=getty.target
IgnoreOnIsolate=yes

[Service]
ExecStart=/usr/bin/myinitscript.sh start
ExecStop=/usr/bin/myinitscript.sh stop
Type=oneshot
RemainAfterExit=true

[Install]
WantedBy=basic.target

/usr/bin/myinitscript.sh es ejecutable y tiene un shebang al inicio.

Tenga en cuenta que no todo se iniciará en este punto del arranque, pero este es el punto en el que aparece el mensaje de inicio de sesión para el usuario

Aunque esto hace uso Before=y After=, lo fue para mí mucho más comprensible y realmente funciona; No encontré la respuesta anterior lo suficientemente informativa. Esto también le permite usar ambos ExecStart=y ExecStop=, en lugar de limitarse a un Type=simpleservicio similar.

Hack5
fuente
-2

No estoy familiarizado con los detalles o ArchLinux, pero aquí está cómo administrar systemd en general.

Bueno, básicamente systemd es una colección de scripts en /etc/init.d/ que están apuntados por enlaces simbólicos de /etc/rcX.d, donde X es el número de nivel de ejecución. Los enlaces simbólicos en sí tienen el siguiente formato:

[K | S] + nn + [cadena]

dónde:

  • nn es un número que determina el orden en que se ejecutan esos scripts
  • string es el nombre del script tal como aparece en /etc/init.d/
  • y finalmente K o S determinan el comando con el que se invoca el script: detener o iniciar respectivamente.

Entonces, si desea que su secuencia de comandos se ejecute en último lugar en la secuencia de inicio, debe hacer lo siguiente:

  1. ponga su script en /etc/init.d/ y hágalo ejecutable
  2. determine el nivel de ejecución de destino en el que debe comenzar el script (normalmente 2 para la consola y 5 para la interfaz gráfica de usuario). Se puede determinar con algo comorunlevel
  3. eche un vistazo a las secuencias de comandos que ya existen en este nivel de ejecución ls /etc/rc<target runlevel>.d/y elija un número de dos dígitos que sea mayor que cualquier otro que ya esté allí.
  4. utilizando una utilidad específica para su distribución, como update-rc.dpara Debian o chkconfigpara Fedora o manualmente, cree un enlace simbólico /etc/rc.d/S a su script de inicio.
Pavel A
fuente
55
Lo que has descrito es en realidad sysVinit. Si bien es cierto que systemd es compatible con el funcionamiento de sysVinit, hay una diferencia clave: todo se realiza en paralelo. También hay dos tipos de servicios, servicios sysVinit y servicios systemd. Su respuesta puede ayudar a que algo se ejecute después de los servicios sysVinit, pero no necesariamente los de systemd.
Sam
1
Systemd no pretende ser compatible con sysvinit en absoluto, desde el primer día.
lzap