Respostas:
A solução sugerida é executar a unidade de serviço como um serviço normal - consulte a [Install]
seção. Então, tudo tem que ser pensado ao contrário, também dependências. Porque a ordem de desligamento é a ordem de inicialização inversa. É por isso que o script deve ser inserido ExecStop=
.
A seguinte solução está funcionando para mim:
[Unit]
Description=...
[Service]
Type=oneshot
RemainAfterExit=true
ExecStop=<your script/program>
[Install]
WantedBy=multi-user.target
RemainAfterExit=true
é necessário quando você não tem uma ExecStart
ação.
Após criar o arquivo, verifique systemctl daemon-reload
e systemctl enable yourservice --now
.
Acabei de obtê-lo no systemd IRC, os créditos estão indo para o mezcalero.
RemainAfterExit=true
é necessária quando não existe ExecStart
porque systemd
não tentará executar ExecStop
se achar que o serviço não está sendo executado. RemainAfterExit=true
provoca systemd
a acreditar que o serviço está sendo executado, causando assim que ele seja executado ExecStop
no desligamento.
Note that it is usually not sufficient to specify a command for this setting that only asks the service to terminate (for example, by queuing some form of termination signal for it), but does not wait for it to do so.
Tanto quanto eu posso ver, faz o que eu preciso (mas não sei exatamente por que).
[Unit]
Description=Log Traffic
DefaultDependencies=no
Before=shutdown.target reboot.target halt.target
[Service]
ExecStart=/usr/local/bin/perl /home/me/log_traffic.pl --stop
Type=oneshot
kexec.target
ao pouco antes
WantedBy=shutdown.target reboot.target halt.target
à [Unit]
seção. Before=
& After=
não mude dependências.
Para executar um serviço imediatamente antes de iniciar qualquer serviço de reinicialização / desligamento / interrupção / kexec (ou seja, no último momento antes de o sistema de arquivos raiz ser remontado como somente leitura), use esta configuração de serviço:
[Unit]
Description=Save system clock on shutdown
DefaultDependencies=no
After=final.target
[Service]
Type=oneshot
ExecStart=/usr/lib/systemd/scripts/fake-hwclock.sh save
[Install]
WantedBy=final.target
Ative-o com:
systemctl enable my_service.service
Para executar um script imediatamente antes da reinicialização real / shutdown / halt / kexec (quando você não pode gravar no sistema de arquivos raiz, porque foi remontado como somente leitura), adicione esse script executável ao /usr/lib/systemd/system-shutdown
diretório.
Imediatamente antes de executar o sistema, halt / poweroff / reboot / kexec systemd-shutdown executará todos os executáveis em / usr / lib / systemd / system-shutdown / e transmitirá um argumento para eles: "halt", "poweroff", "reboot "ou" kexec ", dependendo da ação escolhida. Todos os executáveis neste diretório são executados em paralelo e a execução da ação não é continuada antes que todos os executáveis sejam concluídos.
Veja também:
https://www.freedesktop.org/software/systemd/man/bootup.html
https://www.freedesktop.org/software/systemd/man/systemd-halt.service.html
final.target
. Idealmente, gostaria que fosse a primeira coisa a ser executada após o usuário fazer $ sudo reboot
.
Não tenho certeza, mas acho que você não precisa da parte da instalação, embora a tenha adicionado explicitamente. Também não testei, mas acho que deve ajudar você a começar:
[Unit]
Description=Log Traffic
Requires=network.target
After=network.target
Before=shutdown.target
DefaultDependencies=no
[Service]
ExecStart=/home/me/so.pl
Type=oneshot
RemainAfterExit=yes
[Install]
WantedBy=shutdown.target
ExecStart=/bin/true
.