Inicia o script bash no encerramento, mas não na reinicialização

1

Estou configurando minha caixa do Linux (que está conectada a um no-break) para desligar meu roteador pfsense antes de desligá-lo. Estou executando o Ubuntu 16.04 e usando o systemd para fazer isso. Eu tenho o serviço systemd configurado e funciona. No entanto, está iniciando o script no desligamento E na reinicialização. Isso não é bom já que a qualquer momento eu reinicio minha caixa de linux, eu vou desligar meu roteador. Como posso alterar meu serviço systemd para que ele seja ativado apenas durante o desligamento?

Minha configuração é a seguinte:

[Unit]
Description=PFSense Shutdown script
After=poweroff.target

[Service]
Type=oneshot
ExecStart=/bin/true
ExecStop=/path/to/script/pfsenseshutdown.sh
RemainAfterExit=yes


[Install]
WantedBy=multi-user.target

E, para referência, o script pfsenseshutdown.sh é bastante simples:

#!/bin/bash
ssh [email protected] -i "sudo /etc/rc.halt"

Qualquer ajuda seria muito apreciada.

    
por cgram 06.01.2017 / 15:34

1 resposta

3

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
    
por 06.01.2017 / 19:30