scripts de desligamento local (fazer e não fazer)

2

No trabalho, estou executando o linux e uso o vagrant diariamente. O que eu acho irritante é que o sistema geralmente trava quando eu reinicio / desligo, se eu me esqueci de vagrant halt de quaisquer caixas virtuais que eu possa ter acionado. Para contrariar isto, gostaria de escrever um script de encerramento, ao longo das linhas de:

#! /bin/sh
cd ~/vagrants/vagrant_1
vagrant halt
cd ../vagrant_2
vagrant halt
exit 0

No entanto, não tenho certeza se ~ ainda estará disponível para mim e, mesmo que seja, se o diretório home em questão sempre será o caminho certo, se o script tiver acesso também. Então eu pensei em fazer:

#! /bin/sh
VAGRANT_HOME="~/vagrants/"    #or "/home/my_user/vagrants"
if [ -d "$VAGRANT_HOME" ]; then
    cd $VAGRANT_HOMEvagrant_1
    vagrant halt
    cd $VAGRANT_HOMEvagrant_2
    vagrant halt
fi

Mas, mesmo assim, não consigo deixar de achar isso bobo, já que adicionei alguns aliasses ao meu arquivo .profile , incluindo:

alias vagranthalt="cd ~/vagrants/vagrant_1 && vagrant halt && cd - && cd ~/vagrants/vagrant_2 && vagrant halt && cd -"

Qual eu gostaria de usar, mas não tenho certeza se esses aliases ainda estarão disponíveis quando meu script for executado. Eu acho que só preciso disso @ runlevel 6, mas também preciso vincular simbolicamente o script para executar no runlevel 0 também.

Basicamente, o que eu gostaria de saber é isto:

  • os aliases existentes estarão disponíveis para mim ou não?
  • Existe um usuário executando este script (e, portanto, poderei usar ~ para home?
  • devo ter certeza de que tenho, pelo menos, direitos de leitura nos diretórios vagabundos no script
  • Existe outra maneira de garantir que as caixas errantes sejam desligadas, o que talvez seja um pouco mais fácil?
por Elias Van Ootegem 03.01.2014 / 09:10

1 resposta

2

Se você não fizer algo especial, o vagrant é um wrapping para o virtualbox.

Você pode obter uma lista de caixas virtuais em execução:

vboxmanage list runningvms

e analise a saída para obter um vmname, faça:

VBoxManage controlvm <vmname> acpipowerbutton

É necessário fazer isso como o usuário que iniciou as VMs

Coloque um link para o script em /etc/rc0.d e /etc/rc6.d da mesma forma que outros softwares ( ls /etc/rc0.d /etc/rc6.d ).

Meu script:

# coding: utf-8

import os
import pwd
from subprocess import check_output, CalledProcessError

user_name = 'zelda'


def main():
    os.chdir('/')
    cmd = ["vboxmanage", "list", "runningvms"]
    if os.getuid() == 0:
        cmd = ['su', '-l', user_name, ] + cmd
    try:
        res = check_output(cmd)
    except CalledProcessError:
        return
    for line in res.splitlines():
        if not line.strip():
            continue
        # split on first char
        vmname = line[1:].split(line[0])[0]
        cmd = ["VBoxManage", "controlvm", vmname, "acpipowerbutton"]
        if os.getuid() == 0:
            cmd = ['su', '-l', user_name, ] + cmd
        check_output(cmd)

if __name__ == "__main__":
    main()
    
por 03.01.2014 / 09:43