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.special
pá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.target
en 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.target
o halt.target
que 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