Execute o comando antes de desligar / reiniciar

15

Eu tenho uma máquina rodando algumas máquinas virtuais vagantes. O problema que tenho é que às vezes me esqueço de desligar a VM antes de desligar ou reiniciar a máquina. Por causa disso, minha máquina ficou presa com esta mensagem: waiting for vboxnet0 to become free

Pesquisei sobre soluções e encontrei esta página:

link

Eu tentei o que eles para o desligamento, mas não funciona.

Eu escrevi um arquivo sh para esse comando:

#!/bin/bash

cd ~/workspace/git/mediaservice
vagrant halt

alguma sugestão?

    
por SERPRO 04.02.2014 / 14:42

6 respostas

11

Se suas VMs vagantes estiverem usando o VirtualBox, você pode modificar o / etc / default / virtualbox e alterar a linha que diz:

SHUTDOWN_USERS=""

para

SHUTDOWN_USERS="all"

Isso me corrigiu no Ubuntu 14.04

    
por GaryBishop 03.07.2014 / 15:46
20

Para executar um script no desligamento ou reinicialização:

  1. salve seu script em /etc/rc6.d
  2. Torne-o executável: sudo chmod +x K99_script

Notas:

  • O script em rc6.d deve estar sem extensão .sh
  • O nome do seu script deve começar com o K99 para ser executado no momento certo.
  • Os scripts neste diretório são executados em ordem alfabética.

fonte

    
por Maythux 04.02.2014 / 14:49
10
  1. Crie um arquivo executável do shell com seu script no diretório /etc/init.d/.

  2. Como isso deve ser executado durante o desligamento ou reinicialização, é necessário criar softlinks em /etc/rc0.d/ e /etc/rc6.d

Exemplo:

sudo ln -s /etc/init.d/<your_file> /etc/rc0.d/k99stop_vm
sudo ln -s /etc/init.d/<your_file> /etc/rc6.d/k99stop_vm
sudo chmod a+x /etc/rc0.d/k99stop_vm /etc/rc6.d/k99stop_vm
    
por Ravi 04.02.2014 / 16:10
6

Como fazer com o Systemd (é mais fácil)

Agora que as variantes do Ubuntu e o Mint mudaram para o systemd, descobri que minhas soluções antigas baseadas no acima são menos satisfatórias. Pesquisei na Web para descobrir como fazer isso com o systemd e acabei combinando a sabedoria dos outros e documentando-a como uma postagem do blog no blogspot. com.au contendo o seguinte tutorial.

Com o systemd você cria um ou dois arquivos para chamar seus scripts usando os modelos abaixo e executa alguns comandos. Simples.

Versão da GUI

Primeiro crie os scripts que você deseja executar na inicialização e / ou no desligamento. Basta fazer um, se você não precisar de ambos. Eu criei .scopening_atstart e .scfullcopy_atend.

Em seguida, verifique se ambos são executáveis clicando com o botão direito do mouse no arquivo, selecionando propriedades e certificando-se de que, sob permissões, você tenha marcado a opção Permitir execução do arquivo como um programa.

Os dois arquivos que criei preenchem e salvam o conteúdo de um ramdisk. Eles também criam um arquivo no meu diretório pessoal para provar que o serviço está funcionando. Eles eram da forma:

#!/bin/sh
cp -pru /home/john/zRamdisk/subdirectory1/* /home/john/.wine/drive_c/subdirectory1/
rm /home/john/stop_time
date +%D' '%T > /home/john/stop_time

Então eu abri meu gerenciador de arquivos como root, abri /etc/systemd/system e criei um arquivo startup.service e um arquivo save-ramdisk.service. Obviamente, você pode escolher seus próprios nomes e nomes genéricos poderiam ter incluído um arquivo de inicialização chamado johns_start.service e um arquivo de desligamento chamado johns_shutdown.service. Apenas não escolha nomes de serviço existentes.

[Unit]
Description=Startup Applications

[Service]
Type=oneshot
RemainAfterExit=false
ExecStart=/home/john/.scopening_atstart

[Install]
WantedBy=multi-user.target

e

[Unit]
Description=Save Ramdisk to Wine drive C

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/true
ExecStop=/home/john/.scfullcopy_atend

[Install]
WantedBy=multi-user.target

Você pode usar os mesmos arquivos de serviço, substituindo o caminho completo do seu script executável pelo meu.

Finalmente para cada um execute o comando systemctl enable your_files_name (mas sem o serviço de sufixo). Então meu primeiro foi systemctl enable startup

Reinicie o computador uma vez para iniciar os serviços. O serviço de início será executado sempre que o systemd inserir o destino multiusuário e o serviço de parada quando sair do destino multiusuário. Arquivos de serviço alternativos com diferentes condições de ativação serão descritos abaixo.

Comandos úteis adicionais incluem:

inicialização ativada pelo systemctl
Inicialização ativa do systemctl
reinicialização do systemctl restart

Mais pode ser encontrado na referência acima.

Versão da CLI (linha de comando)

Esta descrição assume que você opera a partir do seu diretório home ao invés de / home / john, use sudo conforme necessário, e sua escolha de editor onde eu escrevo vim ou svim.

Crie scripts de shell de inicialização e desligamento com a primeira linha #!/bin/sh e torne-os executáveis usando chmod +x my_new_filename .

Crie dois arquivos como acima, ou neste exemplo, um arquivo para lidar com tarefas de inicialização e desligamento. Eu vou executar scripts no meu diretório home, mas @don_crissti mostra algumas alternativas em Stack Exchange .

svim /etc/systemd/system/start_and_stop.service

e copie no conteúdo do arquivo:

[Unit]
Description=Run Scripts at Start and Stop

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/home/john/.startup_commands  #your paths and filenames
ExecStop=/home/john/.shutdown_commands

[Install]
WantedBy=multi-user.target

Em seguida, ative o serviço com o comando:

systemctl enable start_and_stop

e reinicie seu sistema após o qual os serviços estarão ativos. Os comandos systemctl is-enabled start_and_stop e systemctl is-active start_and_stop podem ser usados no monitoramento de seus novos serviços.

Alterando as condições do acionador para desligamento

Os arquivos acima de tudo usam a abertura ou fechamento do ambiente multiusuário para iniciar a execução dos scripts. O arquivo abaixo usa o início de quatro processos potenciais de desligamento para iniciar seus scripts. Adicionar ou remover os alvos na linha Antes + a linha WantedBy permitirá que você faça distinções mais sutis:

Este arquivo foi proposto na segunda resposta deste post , mas não consegui executá-lo até adicionar uma seção de instalação.

Novamente, edite o script em /etc/systemd/service/ e ative-o usando systemctl enable your_file_name . Quando mudei os alvos, usei o comando systemclt disable file_name e, em seguida, reativei o link para os diretórios de destino. Reinicie e o serviço estará funcionando.

[Unit]
Description=Do something required
DefaultDependencies=no
Before=shutdown.target reboot.target halt.target
# This works because it is installed in the target and will be
#   executed before the target state is entered
# Also consider kexec.target

[Service]
Type=oneshot
ExecStart=/home/john/.my_script  #your path and filename

[Install]
WantedBy=halt.target reboot.target shutdown.target
    
por John 9631 06.07.2016 / 07:53
2

Você pode encontrar uma solução aqui: Suspender / retomar todas as caixas do Vagrant no desligamento / inicialização do sistema .

Existe um script de inicialização simples que suspende todas as caixas de execução antes de desligar.

Instalação

Edite /etc/init.d/vagrant-boxes e cole o script do artigo acima e salve. Ou faça o download aqui e salve-o em /etc/init.d/vagrant-boxes . No debian / ubuntu etc, execute

# update-rc.d vagrant-boxes defaults 99 01
  

O número 99 é o número de sequência e deve ser maior que (no meu caso, o número 20 do Virtualbox, que por sinal é o padrão nas distribuições Debian). O segundo número é a sequência ao desligar o computador. Então, pode ser bom fazer primeiro.

    
por milkovsky 14.01.2015 / 09:34
2

Para o Ubuntu 14.10 você é algo como RC04 não RC99

O que fazer do zero

  1. Crie um script em /etc/init.d/scriptName
  2. Link via ln -s /etc/rc6.d/K04scriptName /etc/init.d/scriptName

Etapas que passei

  1. Eu tentei, sem sucesso, usar Ubuntu - Executando um script em inicialização e desligamento
  2. Eu encontrei o script de encerramento do Ubuntu 14.10 com rc0 .d (rc6.d, rc.d)
  3. Alterei de /etc/rc6.d/RC99linkName para /etc/rc6.d/RC04linkName e funciona
por Anthony Astige 29.03.2015 / 04:17