A abordagem a seguir parece executar um script apenas no desligamento e não na reinicialização. Você pode editar o arquivo systemd-poweroff.service
da seguinte forma:
sudo systemctl edit --full systemd-poweroff.service
Na seção [Service]
, você pode adicionar uma linha ExecStartPre
:
ExecStartPre=/path/to/script/pfsenseshutdown.sh
Desta forma, o script não será executado se você desligar o sistema com halt
. Para lidar com este caso, você pode adicionar a mesma linha a systemd-halt.service
.
Observe que nessa abordagem o arquivo de configuração mostrado na pergunta não é usado.
EDITAR: uma possível falha na abordagem anterior, é que o script a ser executado contém um comando ssh
, que pode não funcionar logo antes de desligar o sistema (o systemd pode já ter parado serviços de rede necessários). A abordagem abaixo tenta evitar isso.
Para esta solução, criei uma unidade pfsenseshutdown.service
com o seguinte conteúdo
[Unit]
Description=PFSense Shutdown script
DefaultDedendencies=no
[Service]
Type=oneshot
ExecStart=/usr/bin/touch /dev/shm/shuttingdown
[Install]
WantedBy=systemd-halt.service systemd-poweroff.service
Ao iniciar o procedimento de desligamento, esse arquivo parece fazer com que a linha ExecStart
seja executada imediatamente, fazendo com que o arquivo /dev/shm/shuttingdown
exista (o diretório /dev/shm
é um sistema de arquivos de memória, portanto, ele será limpo depois de uma reinicialização).
Agora, para garantir que seu script seja executado antes que a rede seja completamente inicializada, eu corri
systemctl edit --full networking.service
Originalmente, ele continha a seguinte linha ExecStop
na minha máquina virtual do ubuntu 16.04:
ExecStop=/sbin/ifdown -a --read-environment
Esta linha foi substituída por uma versão que primeiro executa seu script, neste exemplo:
ExecStop=/path/to/script/pfsenseshutdown.sh && /sbin/ifdown -a --read-environment
O script pfsenseshutdown.sh
, em seguida, testa se o arquivo em /dev/shm
existe e executa o comando ssh adequadamente. Eu também adicionei um pequeno comando sleep
: systemd faz muitas coisas em paralelo, e isso ajuda a evitar que o teste falhe porque o arquivo ainda não existe .
#!/bin/bash
sleep 1
if [ -e /dev/shm/shuttingdown ] ; then
# Your ssh command here
fi