Systemd: Cómo ejecutar el script solo al apagar (no al reiniciar)

Systemd: Cómo ejecutar el script solo al apagar (no al reiniciar)

Aquí hay muchas soluciones para ejecutar un script al apagar/reiniciar, pero quiero que mi script solo se ejecute al apagar.

Intenté poner mi script en /usr/lib/systemd/systemd-shutdown y verificar el parámetro $1, como se veaquí, pero no funciona.

Algunas ideas ?

sistema: archlinux con gnome-shell

$systemctl --version                                                                                                                                                                                 
systemd 229
+PAM -AUDIT -SELINUX -IMA -APPARMOR +SMACK -SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN

Respuesta1

Finalmente encontré cómo hacer eso.

Es una idea un poco tonta, pero funciona.

He usado una parte de este hilo:https://stackoverflow.com/questions/25166085/cómo-puede-un-servicio-controlado-por-sistema-distinguir-entre-apagar-y-reiniciar

y este hilo: ¿Cómo ejecutar un script con systemd justo antes del apagado?

He creado este servicio/etc/systemd/system/shutdown_screen.service

[Unit]
Description=runs only upon shutdown
Conflicts=reboot.target
After=network.target

[Service]
Type=oneshot
ExecStart=/bin/true
ExecStop=/bin/bash /usr/local/bin/shutdown_screen
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Que se ejecutará al apagar/reiniciar/detener/lo que sea. (no olvides habilitarlo)

Y en mi script /usr/local/bin/shutdown_screen puse lo siguiente:

#!/bin/bash
# send a shutdown message only at shutdown (not at reboot)    
/usr/bin/systemctl list-jobs | egrep -q 'reboot.target.*start' || echo "shutdown" | nc 192.168.0.180 4243 -w 1

Lo cual enviará un mensaje de apagado a mi arduino, quien apagará mi pantalla.

Respuesta2

Según la systemd.specialpágina de manual, deberías utilizar Before=poweroff.target.

poweroff.objetivo

A special target unit for shutting down and powering off the system.

Applications wanting to power off the system should start this unit.

runlevel0.target is an alias for this target unit, for compatibility with SysV.

Además, como mencioné en mi comentario, debes incluir scripts personalizados en /etc/systemd/system/. El /usr/lib/systemd/system/directorio está destinado a usarse para scripts proporcionados por el sistema.

Entonces, tal vez algo como esto:

[Unit]
Description=runs only upon shutdown
DefaultDependencies=no
Conflicts=reboot.target
Before=shutdown.target
Requires=poweroff.target

[Service]
Type=oneshot
ExecStart=/bin/true
ExecStop=/usr/local/bin/yourscript
RemainAfterExit=yes

Respuesta3

Al leer las respuestas aquí, parece haber muchos malentendidos sobre cómo funciona systemd. En primer lugar, no utilice conflictos para excluir un objetivo. Es importante evitar que servicios en conflicto se ejecuten al mismo tiempo.

Si una unidad tiene una configuración de Conflictos = en otra unidad, iniciar la primera detendrá la segunda y viceversa.

Unidad significa un archivo .service para iniciar un servicio en particular, no un objetivo a alcanzar. En otras palabras, Conflicts=reboot.targeten el mejor de los casos no tiene sentido y, en el peor, le impedirá reiniciar. No hagas esto. No significa que no ejecute esto al reiniciar. Significa cancelar este servicio o reboot.target dependiendo del momento y de cómo systemd interpreta este uso erróneo de conflictos.

A continuación se muestra un ejemplo de una unidad actualmente configurada (también conocida como archivo .service) que se ejecuta solo al apagar, no al reiniciar:

[Unit]
Description=Play sound
DefaultDependencies=no
Before=poweroff.target halt.target

[Service]
ExecStart=/usr/local/bin/playsound.sh
ExecStop=/usr/local/bin/playsound.sh
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=poweroff.target halt.target 

poweroff.target es equivalente al antiguo nivel de ejecución de systemv0 que solo se alcanza al apagar. halt.target es una ruta de apagado alternativa utilizada por systemd y a la que tampoco se puede acceder al reiniciar. La sección de instalación le dice a systemd que agregue este servicio a la lista que debe completarse antes poweroff.targeto halt.targetque se considerará alcanzado.

Este servicio está instalado y ejecutándose en mi sistema.

Respuesta4

He probado la mayor parte de la publicación aquí y en varios sitios. El único que realmente funcionó para ejecutarse solo al reiniciar (no al arrancar nuevamente, pero en realidad falló cuando se apagó, detuvo y apagó) es la publicación de @ benoit2600. su segundo post/solución

Pero después de las pruebas descubrí que puedes usar en la Unidad los 4 objetivos y se ejecutará cuando uno de ellos SÓLO se use. Descanse según sus necesidades y las suyas. En "ExecStop=mycommand" acabo de escribir mi comando directo (ya que no necesitaba un bash completo)

[Unit]
Conflicts=reboot.target poweroff.target halt.target shutdown.target

información relacionada