Nota: Uma pergunta resumida pode ser encontrada na parte inferior.
Eu tenho um script que faz um backup dos meus arquivos em uma unidade USB externa. Executá-lo pode demorar um pouco, dependendo da quantidade de novos dados que eu criei. Eu quero executá-lo automaticamente em cada desligamento do sistema.
Estou usando o fedora 23 com as atualizações mais recentes (systemd).
Tentei conseguir isso de várias maneiras, mas não consegui que funcionasse.
Processo de execução longa com 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
Eu o ativei com systemctl enable autobackup.service
e comecei com systemctl start autobackup.service
.
Parte do meu log de inicialização ( 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.
Note que eu não encurtei nada no meio, realmente desmontou / mnt / BACKUP pouco antes do script começar, coincidência engraçada ..
Antes do 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
A saída é basicamente a mesma.
O problema
Eu acho que o problema é que systemd inicia meu script em paralelo com todos os outros scripts de desligamento em ambos os casos, que desmontam BACKUP e desativam a infraestrutura de pipe (outro erro que às vezes acontecia, quando a desmontagem não era rápida o suficiente).
A questão
Como eu posso ensinar o systemd a iniciar meu script primeiro no desligamento, espere até que ele saia e então inicie o resto dos scripts de desligamento / metas / unidades / o que quer que seja?