Nota: A pergunta formulada brevemente pode ser encontrada na parte inferior.
Eu tenho um script que faz um backup dos meus arquivos em uma unidade USB externa. A execução pode demorar um pouco, dependendo da quantidade de novos dados que eu criei. Quero executá-lo automaticamente em todos os desligamentos do sistema.
Estou usando o fedora 23 com as atualizações mais recentes (systemd).
Tentei fazer isso de várias maneiras, mas não consegui fazê-lo funcionar.
Processo de longa execução 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 systemctl enable autobackup.service
e iniciei 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 reduzi nada no meio, ele realmente desmontou / mnt / BACKUP pouco antes do início do script, coincidência engraçada ..
Antes de 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
Acho que o problema é que o systemd inicia meu script em paralelo com todos os outros scripts de desligamento nos dois casos, que desmontam BACKUP e desativam a infraestrutura do canal (outro erro que às vezes recebia quando a desmontagem não era rápida o suficiente).
A questão
Como posso ensinar ao systemd que inicie meu script primeiro no desligamento, aguarde até que ele saia e inicie o restante dos scripts / destinos / unidades / o que for?