Executar um script antes do desligamento da reinicialização

1

Estive puxando meu cabelo sobre este nas últimas duas semanas. Eu não posso, para a vida de mim, descobrir como fazer isso funcionar:

A situação

Eu estou rodando um servidor Debian 9 com algumas máquinas virtuais do VirtualBox que eu quero 'salvar estado' quando o servidor for desligado para reiniciar o poweroff. Depois que o servidor for reiniciado, quero que os vms comecem de novo.

O script para salvar e depois iniciar o vm está funcionando como um encanto. Não há problema aí. A parte em que eles são iniciados após a inicialização também está bem. O problema está na parte de desligamento. Então simplifiquei um pouco as coisas.

A questão restante

Eu tenho um script: /home/vorkbaard/goingdown.sh. Ele envia um e-mail para mim mesmo informando que o servidor está indo para baixo. O script funciona bem. No poweroff, no entanto, ele começa a executar, mas é interrompido pela queda da rede antes de terminar.

O que eu quero é ter um script executado após o comando poweroff ou reboot ser dado, mas antes que qualquer outra coisa seja ativada, como rede ou sistemas de arquivos sendo desativados. O processo precisa aguardar até que o script seja concluído com êxito.

Eu tentei usando Systemd e SysV, mas enquanto eu estou bem familiarizado com o SysV ele não me deixa escolher minha própria ordem de execução, eu acho que porque o Systemd está substituindo o is, e de qualquer forma eu gostaria mudar para o Systemd completamente porque o SysV está sendo desativado no Debian. Eu gostaria de ficar com o Debian, não mudar para Devuan ou RHEL.

Eu sei que criar arquivos unitários e movê-los para o local adequado é o caminho a seguir, mas como eu disse - não posso, para minha vida, descobrir a maneira correta de fazer isso. Existem inúmeros exemplos, mas nenhum parece específico da minha situação.

As perguntas atuais

Quais arquivos de unidade devo criar, onde devo colocá-los e como posso dizer ao meu servidor para executá-los antes de qualquer outra coisa, uma vez que uma reinicialização ou desligamento seja emitido?

Também tentou adaptar Executar script simples antes do desligamento e reinicie :

Em /etc/systemd/system/test.service:

[Unit]
Description=Send an email on shutdown and reboot

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/bash (also tried with /bin/true)
ExecStop=/root/rebootscript (also tried ExecStop=sh /root/rebootscript. Then the script does nothing on reboot.)
[Install]
WantedBy=multi-user.target

Em seguida, reiniciei, fizemos systemctl status test.service e ele disse active (exited) . No entanto, na reinicialização, aparece uma mensagem informando A stop job is running for Send an e...utdown and reb oot (34s / 1min 30s)_ e, depois de 1,5 minutos, apenas expira, nenhum e-mail é enviado e o servidor é reinicializado.

/var/log/syslog sais:

Stopping Send an email on shutdown and reboot...
Creating SSL connection to host
SSL connection using RSA_AES_128_CBC_SHA1
Sent mail for [my email address here] (221. 2.0.0 closing connection q45sm79107etc.53 - gsmtp) uid=0 username=root outbytes=509
Stopped Send an email on shutdown and reboot

Mas o email não é enviado e nenhum email está no mailqueue. Além disso, nenhum erro aparece na conta da qual estou enviando o e-mail. Novamente, o script funciona bem quando executado manualmente.

Em /root/rebootscript é:

/bin/bash
NOW=$(/bin/date +"%H:%M")
/bin/echo "Rebooting $NOW" | /usr/bin/mailx -s "Rebooting $NOW" [my email address here]

Curiosamente, se eu systemctl stop test.service recebo uma mensagem dizendo que o servidor está sendo reinicializado, o serviço em si parece funcionar.

    
por Forkbeard 02.02.2018 / 12:34

1 resposta

1

Ok, eu percebi. O script na minha postagem original foi ok, mas foi executado após a queda da rede, o que explica por que o email não foi enviado.

Detalhes: link

O script que funcionou:

[Unit]
Description=Send an email on shutdown and reboot
Wants=network-online.target   <---- ADDED THIS
After=network-online.target   <----/

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/bash (also tried with /bin/true)
ExecStop=/root/rebootscript (also tried ExecStop=sh /root/rebootscript. Then the script does nothing on reboot.)
[Install]
WantedBy=multi-user.target

Provavelmente, há muito no arquivo acima, mas isso definitivamente funciona.

Obrigado a todos:)

    
por 05.02.2018 / 14:19