Nota: La pregunta formulada brevemente se puede encontrar en la parte inferior.
Tengo un script que hace una copia de seguridad de mis archivos en una unidad USB externa. Ejecutarlo puede llevar un tiempo, dependiendo de la cantidad de datos nuevos que haya creado. Quiero ejecutarlo automáticamente en cada apagado del sistema.
Estoy usando fedora 23 con las últimas actualizaciones (systemd).
Traté de lograr esto de varias maneras, pero no pude hacerlo funcionar.
Proceso de larga ejecución con StopExec
autobackup.service:
[Unit]
Description=Slow backup script
Requires=local-fs.target
[Service]
ExecStart=/bin/true
ExecStop=/etc/systemd/system/do_backup.sh
Type=oneshot
RemainAfterExit=yes
[Install]
WantedBy=multiuser.target
Lo activé con systemctl enable autobackup.service
y comencé con systemctl start autobackup.service
.
Parte de mi registro de arranque ( journalctl -b-1
):
Dez 22 17:45:27 localhost systemd[1]: Unmounted /mnt/BACKUP.
Dez 22 17:45:27 localhost do_backup.sh[4296]: At subvol /home/BACKUP.2015_12_22-17_45_25
Dez 22 17:45:27 localhost do_backup.sh[4296]: ERROR: parent subvol is not reachable from inside the root subvol.
Dez 22 17:45:27 localhost do_backup.sh[4296]: At snapshot BACKUP.2015_12_22-17_45_25
Dez 22 17:45:27 localhost do_backup.sh[4296]: ERROR: failed to dump stream. Broken pipe
Dez 22 17:45:27 localhost systemd[1]: autobackup.service: Control process exited, code=exited status=1
Dez 22 17:45:27 localhost systemd[1]: Stopped Slow backup script.
Dez 22 17:45:27 localhost systemd[1]: autobackup.service: Unit entered failed state.
Tenga en cuenta que no acorté nada en el medio, realmente desmontó / mnt / BACKUP justo antes de que comenzara el script, una coincidencia graciosa ...
Antes del apagado.
autobackup.service:
[Unit]
Description=Slow backup script
DefaultDependencies=no
Before=shutdown.target
[Service]
ExecStart=/etc/systemd/system/do_backup.sh
Type=oneshot
systemctl edit shutdown.target
[Unit]
Requires=autobackup.service
La salida es básicamente la misma.
El problema
Creo que el problema es que systemd inicia mi secuencia de comandos en paralelo con todas las demás secuencias de comandos de apagado en ambos casos, que desmontan BACKUP y desactivan la infraestructura de tuberías (otro error que recibí a veces, cuando el desmontaje no era lo suficientemente rápido).
La pregunta
¿Cómo puedo enseñarle a systemd a iniciar mi script primero en el apagado, esperar hasta que salga y luego iniciar el resto de los scripts / objetivos / unidades / lo que sea?
fuente
/lib/systemd/system-shutdown/
. Además, tenga en cuenta que estos scripts se ejecutan muy tarde en el apagado, después de que los sistemas de archivos ya están montados de solo lectura. Por lo tanto, cualquier acceso de escritura al sistema de archivos fallará a menos que se vuelva a montar como lectura-escritura (mount -oremount,rw /
). Consulte ¿Cómo ejecutar scripts en / usr / lib / systemd / system-shutdown / al reiniciar o apagar?¡Lo tengo!
Tome la solución Proceso de ejecución prolongada con StopExec y modifíquelo así:
autobackup.service:
Tenga en cuenta la línea:
Funciona como se esperaba de esta manera.
fuente
systemctl edit
.systemctl enable autobackup
tiene el mismo efecto y es más idiomático, y debería funcionar ya que ya tiene la[Install]
sección en su unidad. Sin embargo, tendrá que corregir ese error tipográfico en el nombre del objetivo. ;)