Remarque: Une question brièvement formulée se trouve en bas.
J'ai un script qui fait une sauvegarde de mes fichiers sur une clé USB externe. Son exécution peut prendre un certain temps, selon la quantité de nouvelles données que j'ai créées. Je veux l'exécuter automatiquement à chaque arrêt du système.
J'utilise fedora 23 avec les dernières mises à jour (systemd).
J'ai essayé d'y parvenir de plusieurs façons, mais je n'ai pas réussi à le faire fonctionner.
Processus long avec 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
Je l'ai activé avec systemctl enable autobackup.service
et commencé avec systemctl start autobackup.service
.
Une partie de mon journal de démarrage ( 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.
Notez que je n'ai rien raccourci entre les deux, il a vraiment démonté / mnt / BACKUP juste avant le début du script, drôle de coïncidence ..
Avant 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
La sortie est fondamentalement la même.
Le problème
Je pense que le problème est que systemd démarre mon script en parallèle avec tous les autres scripts d'arrêt dans les deux cas, qui démontent BACKUP et désactivent l'infrastructure de canal (une autre erreur que j'ai parfois eue, lorsque le démontage n'était pas assez rapide).
La question
Comment puis-je apprendre à systemd à démarrer mon script en premier à l'arrêt, attendre qu'il se termine et ensuite démarrer le reste des scripts / cibles / unités / quoi que ce soit d'arrêt?
/lib/systemd/system-shutdown/
. Et sachez également que ces scripts sont exécutés très tard lors de l'arrêt, une fois que les systèmes de fichiers sont déjà montés en lecture seule. Ainsi, tout accès en écriture au système de fichiers échouera à moins qu'il ne soit remonté en lecture-écriture (mount -oremount,rw /
). Voir Comment exécuter des scripts dans / usr / lib / systemd / system-shutdown / au redémarrage ou à l'arrêt?J? ai compris!
Prenez la solution Processus long avec StopExec et modifiez-le comme suit :
autobackup.service:
Notez la ligne:
Cela fonctionne comme prévu de cette façon.
la source
systemctl edit
.systemctl enable autobackup
a le même effet et est plus idiomatique, et devrait fonctionner puisque vous avez déjà la[Install]
section dans votre unité. Vous devrez cependant corriger cette faute de frappe dans le nom cible. ;)