Executar script antes do shutdown/restart, Systemd no Debian 8 [RESOLVIDO]

1. Executar script antes do shutdown/restart, Systemd no Debian 8 [RESOLVIDO]

Jonatas Prust
JPrust

(usa Ubuntu)

Enviado em 21/05/2015 - 08:51h

Olá...

Estou configurando um servidor com Debian 8, e preciso executar um script antes de desligar ou reiniciar o computador.
Não consegui entender na prática o que tenho que fazer no systemd para isso funcionar, se alguém puder explicar passo a passo, ficarei grato.
Este script realiza o savestate das vms que tenho no servidor.

Att
Jonatas


  


2. MELHOR RESPOSTA

Perfil removido
removido

(usa Nenhuma)

Enviado em 28/05/2015 - 19:42h

JPrust escreveu:

Olá...

Eu não consigo entender porque ninguém responde o tópico, eu não encontrei uma solução no google, somente alguns poucos tópicos falando sobre o systemd.
Postei no lugar errado?
É tão óbvio que não vale a pena responder?

Att
Jonatas


Acontece, talvez o pessoal que leu também não tenha uma resposta (Muita gente não gosta do systemd, fora os que ainda não adaptaram-se a ele. Então ainda vai demorar para acharmos tudo com a facilidade que tínhamos com o SysV/Upstart. O que eu precisei até agora, tive que garimpar bastante).

JPrust escreveu:
O problema agora, parece ser a sequência de execução dos serviços, quando o script é executado, o sistema parece já ter matado o processo necessário para dar o savestate do virtual box.
Isso é executado antes:
Stopping LSB: VirtualBox Linux Kernel 

Alguém sabe como posso fazer para que meu processo seja executado antes, como poderia quem sabe torná-lo a primeira coisa a ser executada?

Tente usando a opção [b]ExecStartPre[/] no(s) arquivo(s) do(s) serviço(s), então pode apontar para um script (Pode ser um .sh simples, que carregue os módulos do virtualbox). O Mesmo vale ao desligar, pode usar esta opção apontando para o seu serviço ou um scrippt que o chame (Ainda é POG, mas deve resolver ao menos até "dominar" o systemd por completo e encontrar uma forma mais "elegante" de fazer isto):

No arquivo do serviço algo como abaixo(Deve por o parâmetro antes do ExecStart):


...
ExecStartPre=/caminho/seu/script.sh
ExecStart=...
...




------------------------------------------------------
¿? -> keyboard Error: No Keyboard Present, PRESS F1 to continue.


3. Re: Executar script antes do shutdown/restart, Systemd no Debian 8 [RESOLVIDO]

Marco Antonio Hubert
marcoahubert

(usa Debian)

Enviado em 21/05/2015 - 09:09h


bom dia!

Na inicialização do servidor vc usa nano /etc/rc.local, coloque o caminho do script uma linha antes do exit 0.
Para o desligamento tente o seguinte caminho /etc/rc.d/rc

Atenciosamente,
Marco A. Hubert


4. Systemd

Jonatas Prust
JPrust

(usa Ubuntu)

Enviado em 21/05/2015 - 09:48h

marcoahubert escreveu:
bom dia!

Na inicialização do servidor vc usa nano /etc/rc.local, coloque o caminho do script uma linha antes do exit 0.
Para o desligamento tente o seguinte caminho /etc/rc.d/rc

Atenciosamente,
Marco A. Hubert


Bom dia Marcos.

Ao inicializar eu coloquei a linha para chamar o script de inicialização das vms em /etc/rc.local, isso funciona.
Mas tbm coloquei o script para salvar o estado das vms em /etc/rc0.d/nomedoscript.sh e /etc/rc6.d/nomedoscript.sh, e isso não funciona(reboot e shutdown).
Será que isso não tem nada a ver com o novo systemd, que passou a ser utilizado no Debian?

Att
Jonatas




5. Re: Executar script antes do shutdown/restart, Systemd no Debian 8 [RESOLVIDO]

Isma
ismabsd

(usa FreeBSD)

Enviado em 21/05/2015 - 16:58h

Também estou com esse problema.. Antes era o arquivo /etc/acpi/powerbtn-acpi-support.sh


6. Debian 8 Script ao desligar reiniciar

Jonatas Prust
JPrust

(usa Ubuntu)

Enviado em 22/05/2015 - 09:17h

Olá...

Eu não consigo entender porque ninguém responde o tópico, eu não encontrei uma solução no google, somente alguns poucos tópicos falando sobre o systemd.
Postei no lugar errado?
É tão óbvio que não vale a pena responder?

Att
Jonatas



7. Re: Executar script antes do shutdown/restart, Systemd no Debian 8 [RESOLVIDO]

Isma
ismabsd

(usa FreeBSD)

Enviado em 22/05/2015 - 13:54h

Uma solução simples, no arquivo /etc/systemd/system/poweroff.target.wants/hwclock-save.service

[Unit]
Description=Synchronise Hardware Clock to System Clock
DefaultDependencies=no
Before=shutdown.target
ConditionFileIsExecutable=!/usr/sbin/ntpd
ConditionFileIsExecutable=!/usr/sbin/openntpd
ConditionFileIsExecutable=!/usr/sbin/chrony
ConditionVirtualization=!container

[Service]
Type=oneshot
ExecStart=/sbin/hwclock -D --systohc
ExecStart=/usr/scripts/teste.sh args (Adiciona essa linha apontando para seu script.)

[Install]
WantedBy=reboot.target halt.target poweroff.target



Ou criar um novo arquivo.


8. Serviço do Systemd

Jonatas Prust
JPrust

(usa Ubuntu)

Enviado em 26/05/2015 - 10:38h

Bom dia!

Ismabsd, obrigado pela sua solução, realmente funciona.
Agora eu estou tentando criar um novo serviço para executar o script, ficou assim:
[Unit]
Description=Salva o estado das maquinas virtuais
DefaultDependencies=no
Before=shutdown.target halt.target reboot.target poweroff.target

[Service]
Type=oneshot
ExecStart=/dados/dados/scripts/virtual/savestate_vms.sh args

[Install]
WantedBy=shutdown.target halt.target reboot.target poweroff.target


systemctl enable savestate-vm

Infelizmente não estou tendo sucesso, posso utilizar os comandos shutdown-poweroff-reboot, e a máquina virtual é interrompida. O que estou fazendo errado?

Att
Jonatas


9. Serviço em Systemd

Jonatas Prust
JPrust

(usa Ubuntu)

Enviado em 26/05/2015 - 10:46h


Resultado do comando :
systemctl status savestate-vm 

● savestate-vm.service - Save the state of the virtual machines
Loaded: loaded (/etc/systemd/system/savestate-vm.service; enabled)
Active: inactive (dead)

Att
Jonatas


10. Executar script antes do shutdown/restart, Systemd no Debian 8

Jonatas Prust
JPrust

(usa Ubuntu)

Enviado em 27/05/2015 - 09:42h


Agora o systemd está executando meu script. Escrevi novamente meu serviço para o Systemd, ficou assim
[Unit]
Description=Save the state of the virtual machines
Before=shutdown.target halt.target reboot.target poweroff.target

[Service]
ExecStart=/bin/true
ExecStop=/dados/dados/scripts/virtual/savestate_vms.sh
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

O problema agora, parece ser a sequência de execução dos serviços, quando o script é executado, o sistema parece já ter matado o processo necessário para dar o savestate do virtual box.
Isso é executado antes:
Stopping LSB: VirtualBox Linux Kernel 

Alguém sabe como posso fazer para que meu processo seja executado antes, como poderia quem sabe torná-lo a primeira coisa a ser executada?


11. Solução - Debian 8 e VirtualBox - Systemd - iniciar e salvar estado automaticamente

Jonatas Prust
JPrust

(usa Ubuntu)

Enviado em 28/05/2015 - 13:42h


Bom, vendo que quase ninguém responde meus tópicos, e talvez seja porque tenho que colocar mais informações, vou tentar melhorar neste ponto, a versão do kernel e debian que estou usando(depois da atualização):
uname -v 

SMP Debian 3.16.7-ckt9-3~deb8u1 (2015-04-24) 

O virtualbox foi atualizado, a versão em uso é a 4.3.28 r100309.
DKMS e headers instalados.

Bom... vamos lá para a possível "solução do problema", pode parecer(ou simplesmente seja) uma gambiara, fiz o seguinte:
Atualizei o sistema(para garantir que está tudo atualizado):
apt-get update 

apt-get upgrade 

Criei o seguinte processo para iniciar e salvar o estado do virtualbox:
[Unit]
Description=VBox Virtual Machine Service
Requires=systemd-modules-load.service
After=systemd-modules-load.service

[Service]
User=administrador
Group=vboxusers
ExecStart=/usr/bin/VBoxHeadless -s shop-rga
ExecStop=/usr/bin/VBoxManage controlvm shop-rga savestate

[Install]
WantedBy=multi-user.target

O usuário administrador é membro do grupo vboxusers e dono das vms.
usermod -a -G vboxusers administrador 

chown -R administrador.grupo /local/davm 

chmod -R 1770 /local/davm  

De toda forma Isso não funcionou comigo, aparecendo o seguinte erro:
shop-rga.service - VBox Virtual Machine Service
Loaded: loaded (/etc/systemd/system/shop-rga.service; enabled)
Active: failed (Result: exit-code) since Qui 2015-05-28 13:25:42 BRT; 47s ago
Process: 878 ExecStop=/usr/bin/VBoxManage controlvm shop-rga savestate (code=exited, status=1/FAILURE)
Process: 786 ExecStart=/usr/bin/VBoxHeadless -s shop-rga (code=exited, status=1/FAILURE)
Main PID: 786 (code=exited, status=1/FAILURE)

Mai 28 13:25:33 servidor-rga VBoxHeadless[786]: WARNING: The vboxdrv kernel module is not loaded. Either there is no module
Mai 28 13:25:33 servidor-rga VBoxHeadless[786]: available for the current kernel (3.16.0-4-amd64) or it failed to
Mai 28 13:25:33 servidor-rga VBoxHeadless[786]: load. Please recompile the kernel module and install it by
Mai 28 13:25:33 servidor-rga VBoxHeadless[786]: sudo /etc/init.d/vboxdrv setup
Mai 28 13:25:33 servidor-rga VBoxHeadless[786]: You will not be able to start VMs until this problem is fixed.
Mai 28 13:25:34 servidor-rga VBoxHeadless[786]: VBoxHeadless: Error -1908 in suplibOsInit!
Mai 28 13:25:34 servidor-rga VBoxHeadless[786]: VBoxHeadless: Kernel driver not installed
Mai 28 13:25:34 servidor-rga VBoxHeadless[786]: VBoxHeadless: Tip! Make sure the kernel module is loaded. It may also help to reinstall VirtualBox.
Mai 28 13:25:36 servidor-rga systemd[1]: shop-rga.service: main process exited, code=exited, status=1/FAILURE
Mai 28 13:25:42 servidor-rga VBoxManage[878]: VBoxManage: error: Machine in invalid state 2 -- saved
Mai 28 13:25:42 servidor-rga systemd[1]: shop-rga.service: control process exited, code=exited status=1
Mai 28 13:25:42 servidor-rga systemd[1]: Unit shop-rga.service entered failed state.

Se eu executar o processo manualmente:
systemctl start nomeprocesso 

systemctl stop nomeprocesso 

Tudo ocorre perfeitamente bem, a vm é iniciada e possui seu estado salvo.
Pensando sobre o problema, imagino que os módulos do virtualbox(vboxdrv e outros) não estavam sendo carregados a tempo, e sem encontrar uma outra solução, criei mais um processo para fazer isso:
[Unit]
Description=Iniciar os modulos do virtualbox
Before=shop-rga.service

[Service]
User=root
Type=oneshot
ExecStart=/sbin/modprobe vboxdrv
ExecStart=/sbin/modprobe vboxnetadp
ExecStart=/sbin/modprobe vboxnetflt

[Install]
WantedBy=multi-user.target

Assim está funcionando, quem sabe isso possa ajudar, de toda forma, como falei é uma gambiarra, se alguém tiver (e com certeza alguém tem) uma maneira melhor de fazer, posta ai!

Agora o que estava funcionando parou de funcionar, preciso desligar o servidor pelo botão power, agora ele parou de fazer isso. Deveria criar um novo tópico para isso, ou alguém já possui uma solução?


12. Re: Executar script antes do shutdown/restart, Systemd no Debian 8

Buckminster
Buckminster

(usa Debian)

Enviado em 28/05/2015 - 15:06h

Essa dica te ajuda?

http://www.vivaolinux.com.br/dica/Inicializando-e-Desligando-uma-maquina-virtual-do-VirtualBox-por-a...

Somente mude de /etc/rc.d/init.d para /etc/init.d e inclua a extensão .sh no arquivo, como está nos comentários.
Não sei se é isso que tu quer.


E quanto ao "Alguém sabe como posso fazer para que meu processo seja executado antes, como poderia quem sabe torná-lo a primeira coisa a ser executada?"

tu terá que executar updaterc.d, sendo que o teu script deve estar dentro do diretório /etc/init.d.

# update-rc.d script start 01 2 3 4 5 . stop 01 0 1 6 .

asim ele inicializará primeiro, ou se quiser verifique antes a posição entrando nos diretórios /etc/rc1.d, /etc/rc2.d, etc.



01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts