2016-01-20 11 views
8

Czytałem samouczek w bashu, w którym powiedzieli, aby ponownie uruchomić maszynę, nie było opcji, aby ponownie uruchomić usługę bezpośrednio, było to kwestią ponownego uruchomienia komputera, a następnie było więcej poleceń po tym, że nadal musi być uruchamiany podczas udostępniania.Czy można zrestartować maszynę przy wyposażaniu maszyny za pomocą narzędzia Vagrant i odczytywania, gdy skrypt przestał działać?

Więc jest jakiś sposób, aby ponownie uruchomić okno pośród rezerw, a następnie odebrać w którym zostało przerwane po tym?

+1

Co provisioning używacie? – dizballanze

+0

[vaggent vbguest plugin] (https://github.com/dotless-de/vagrant-vbguest/) robi to, aby było możliwe. nigdy nie zaglądajcie głęboko w to, jak sobie radzą, a jego wtyczka może być trochę inna, ale możecie wpaść na dobry pomysł –

+0

@dizballanze Bash w tym momencie ... – leeand00

Odpowiedz

8

O ile wiem, nie można mieć jednego skryptu/zestaw poleceń, które prowadzą w którym zostało przerwane, jeśli próbuje ponownie uruchomić systemu operacyjnego, takich jak:

config.vm.provision "shell", inline: <<-SHELL 
    echo $(date) > ~/rebootexample 
    reboot 
    echo $(date) >> ~/rebootexample 
    SHELL 

W tym przykładzie drugie wywołanie echa nie zostanie przeprowadzone.

Mógłbyś podzielić skryptu/polecenia i używać wtyczki takie jak vagrant reload.

Przykładowy fragment z Vagrantfile aby podkreślić jego ewentualne zastosowanie:

# execute code before reload 
    config.vm.provision "shell", inline: <<-SHELL 
    echo $(date) > ~/rebootexample 
    SHELL 

    # trigger reload 
    config.vm.provision :reload 

    # execute code after reload 
    config.vm.provision "shell", inline: <<-SHELL 
    echo $(date) >> ~/rebootexample 
    SHELL 
3

Nigdy nie robiłem tego, ale gdybym miał chciałbym podzielić skrypt na dwie części, jedna przed ponownym uruchomieniem, który zawiera polecenie restartu, potem drugi to po instalacji.

Pierwsza z nich również utworzy plik blokady.

Ogólny scenariusz byłoby uruchomić pierwszy skrypt, jeśli plik blokady nie istnieje lub uruchomić drugi, jeśli plik istnieje. Ten ogólny skrypt zostanie skonfigurowany do uruchomienia.

0

Jeden trick można zatrudnić ma wysłać sygnał restartu i uratować resztę pracy rezerw jako skrypt do uruchomienia przy starcie:

config.vm.provision "shell", inline: <<-SHELL 
    echo "Do your thing... DONE" 
cat <<-RCLOCAL | sed -s 's_^  __' > /etc/rc.local 
     #!/bin/bash 
     echo "This will be run once on next boot and then it's destroyed and never run again" 
     rm /etc/rc.local 
RCLOCAL 
    chmod o+x /etc/rc.local 
    shutdown -r now #restart 
SHELL 

ten został przetestowany na Debianie 9, więc może trzeba włączyć usługi lub znaleźć inny sposób na zdobycie kodu bootsrapped do uruchomienia na następnym rozruchu jeśli używasz czegoś innego.

Niestety nie można po prostu zrobić:

config.vm.provision "shell", inline: "shutdown -r now" 
config.vm.provision "shell", inline: "echo 'hello world'" 

results in ==> 
The SSH connection was unexpectedly closed by the remote end. This 
usually indicates that SSH within the guest machine was unable to 
properly start up. Please boot the VM in GUI mode to check whether 
it is booting properly.