Como executo um script antes de tudo no desligamento com o systemd?

14

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?

    
por le_me 22.12.2015 / 18:10

2 respostas

9

Eu entendi!

Leve a solução Processo de execução longa com StopExec e modifique-a da seguinte forma:

autobackup.service:

[Unit]
Description=Slow backup script
RequiresMountsFor=/mnt/BACKUP /home

[Service]
ExecStop=/etc/systemd/system/do_backup.sh
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Anote a linha:

RequiresMountsFor=/mnt/BACKUP /home

Funciona como esperado desta maneira.

    
por 22.12.2015 / 18:46
9

Não há necessidade de criar ou editar arquivos de serviço. Basta soltar seu script em

/usr/lib/systemd/system-shutdown/

link

Immediately before executing the actual system halt/poweroff/reboot/kexec systemd-shutdown will run all executables in /usr/lib/systemd/system-shutdown/ and pass one arguments to them: either "halt", "poweroff", "reboot" or "kexec", depending on the chosen action. All executables in this directory are executed in parallel, and execution of the action is not continued before all executables finished.

Eu uso para simplesmente bipar o alto-falante do PC.

    
por 14.05.2016 / 14:08