Nota: la domanda brevemente formulata può essere trovata in fondo.
Ho uno script che esegue un backup dei miei file su un'unità USB esterna. L'esecuzione può richiedere del tempo, a seconda della quantità di nuovi dati che ho creato. Voglio eseguirlo automaticamente ad ogni spegnimento del sistema.
Sto usando Fedora 23 con gli ultimi aggiornamenti (systemd).
Ho provato a raggiungere questo obiettivo in diversi modi, ma non sono riuscito a farlo funzionare.
Processo di lunga durata 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
L'ho attivato con systemctl enable autobackup.service
e iniziato con systemctl start autobackup.service
.
Parte del mio registro di avvio ( 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.
Nota che non ho abbreviato nulla in mezzo, è stato smontato / mnt / BACKUP poco prima dell'inizio dello script, coincidenza divertente ..
Prima di shutdown.target
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
L'output è sostanzialmente lo stesso.
Il problema
Penso che il problema sia che systemd avvia il mio script in parallelo con tutti gli altri script di arresto in entrambi i casi, che smontano BACKUP e disattivano l'infrastruttura del tubo (un altro errore che a volte ho avuto, quando lo smontaggio non era abbastanza veloce).
La domanda
Come posso insegnare a systemd ad avviare prima il mio script all'arresto, attendere fino alla sua uscita e quindi avviare il resto degli script / destinazioni / unità di arresto / qualunque cosa?