Wykonaj polecenie przed zamknięciem / ponownym uruchomieniem [duplikat]


19

Mam maszynę z kilkoma błędnymi maszynami wirtualnymi. Problemem jest to, że czasami zapominam zamknąć maszynę wirtualną przed zamknięciem lub ponownym uruchomieniem komputera. Z tego powodu moja maszyna utknęła z tym komunikatem:waiting for vboxnet0 to become free

Szukałem rozwiązań i znalazłem tę stronę:

http://en.kioskea.net/faq/3348-ubuntu-executing-a-script-at-startup-and-shutdown

Próbowałem tego, co zamknęły, ale to nie działa.

Napisałem plik sh dla tego polecenia:

#!/bin/bash

cd ~/workspace/git/mediaservice
vagrant halt

jakieś sugestie?


4
Metoda w linku jest poprawna i działa na wszystkich wersjach systemu Linux, więc skrypt jest niepoprawny;) Użytkownik nie jest znany podczas zamykania, ponieważ robi to użytkownik root. Więc upuść „~” i uczyń to pełną ścieżką.
Rinzwind

Czy to działa? Śledziłem podobnego manuela, takiego jak gist.github.com/ymc-geha/8416723, ale nie pracowałem dla mnie na Ubuntu 14.04
user2135804

@ user2135804 Myślałem, że to działa ... ale tak naprawdę to nie działa dla Vagrant .. Próbowałem z innymi rzeczami i działało dobrze.
SERPRO

1
Nawiasem mówiąc, błąd, który opisujesz, jest tutaj .
Garrett,

1
Jak widać w zgłoszeniu błędu, zostało to naprawione i zostanie dołączone do VirtualBox 4.3.29.
Garrett

Odpowiedzi:


12

Jeśli twoje wirtualne maszyny wirtualne używają VirtualBox, możesz zmodyfikować / etc / default / virtualbox i zmienić wiersz o treści:

SHUTDOWN_USERS=""

do

SHUTDOWN_USERS="all"

Naprawiłem to na Ubuntu 14.04


1
W rzeczywistości jest z tym związany otwarty bilet w wirtualnym pudełku. virtualbox.org/ticket/12264 . Używałbym SHUTDOWN_USERS=`cut -d: -f1 /etc/passwd`zamiastSHUTDOWN_USERS="all"
running.t

Korzystam również z Ubuntu 14.04 z Vagrant za pomocą VirtualBox, ale nie mam żadnego /etc/default/virtualboxpliku ...
Garrett

21

Aby wykonać skrypt podczas zamykania lub ponownego uruchamiania:

  1. zapisz skrypt w /etc/rc6.d
  2. Spraw, by był wykonywalny: sudo chmod +x K99_script

Uwagi:

  • Skrypt w rc6.d musi być bez rozszerzenia .sh
  • Nazwa skryptu musi zaczynać się od K99, aby uruchomić się we właściwym czasie.
  • Skrypty w tym katalogu są wykonywane w kolejności alfabetycznej.

źródło


1
W rzeczy samej. Bardzo ważne jest nazywanie go poprawnie, aby działało we właściwym czasie.
shivams,

2
Umieściłem skrypt w /etc/rc6.d i nie działał on przy wyłączaniu. Umieściłem go w /etc/rc0.d i działał on przy wyłączaniu. Prawdopodobnie rc.6 służy tylko do restartu.
Erel Segal-Halevi

2
@Erel Segal-Halevi Właśnie próbowałem dodać skrypt K99 do /etc/rc6.d i nie zadziałał. Patrząc na inne skrypty, pojawia się wiersz ** pogrubiony K10reboot -> ../init.d/reboot **, więc wygląda na to, że skrypt K99 NIGDY nie zostanie wykonany !!
David Walker,

Odpowiedź z Ravi poniżej jest lepszym wyborem, ponieważ używa dowiązań symbolicznych, aby zapewnić działanie skryptu zarówno podczas zamykania systemu, jak i ponownego uruchamiania. Myślę też, że większość plików systemowych ma takie podejście.
Eddie,

rc.6 wydają się być tylko do ponownego uruchomienia, jak wspomniano w innych. Zobacz
Aelian,

12

Jak to zrobić za pomocą Systemd (łatwiej)

Teraz, gdy warianty Ubuntu i Mint zostały przeniesione do systemd, moje stare rozwiązania oparte na powyższym są mniej satysfakcjonujące. Szukałem w Internecie, aby dowiedzieć się, jak to zrobić za pomocą systemd, i ostatecznie połączyłem mądrość innych i udokumentowałem to jako post na blogu na blogspot.com.au zawierający następujący samouczek.

Za pomocą systemd możesz utworzyć jeden lub dwa pliki do wywoływania skryptów za pomocą poniższych szablonów i wykonać kilka poleceń. Prosty.


Wersja GUI

Najpierw utwórz skrypty, które chcesz uruchomić podczas uruchamiania i / lub zamykania systemu. Zrób jedną, jeśli nie potrzebujesz obu. Utworzyłem .scopening_atstart i .scfullcopy_atend.

Następnie upewnij się, że oba są wykonywalne, klikając prawym przyciskiem myszy plik, wybierając właściwości i upewniając się, że w uprawnieniach zaznaczyłeś opcję Zezwalaj na uruchamianie pliku jako programu.

wprowadź opis zdjęcia tutaj

Dwa utworzone przeze mnie pliki zapełniają się i zapisują zawartość ramdysku. Tworzą również plik w moim katalogu domowym, aby udowodnić, że usługa działa. Były w formie:

#!/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

Następnie otworzyłem menedżera plików jako root, otworzyłem /etc/systemd/systemi utworzyłem plik startup.service i plik save-ramdisk.service. Oczywiście możesz wybrać własne nazwy, a nazwy ogólne mogą zawierać plik startowy o nazwie johns_start.service i plik zamykania o nazwie johns_shutdown.service. Po prostu nie wybieraj istniejących nazw usług.

[Unit]
Description=Startup Applications

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

[Install]
WantedBy=multi-user.target

i

[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

Możesz użyć tych samych plików usługi, zastępując pełną ścieżkę skryptu wykonywalnego moim.

Na koniec dla każdego z nich wykonaj polecenie systemctl włącz nazwę_plików (ale bez usługi sufiksu). Więc mój pierwszy byłsystemctl enable startup

Uruchom ponownie komputer raz, aby uruchomić usługi. Usługa uruchamiania będzie wykonywana za każdym razem, gdy systemd wejdzie do celu dla wielu użytkowników, a usługa zatrzymania, gdy wyjdzie z celu dla wielu użytkowników. Alternatywne pliki usług z różnymi warunkami aktywacji zostaną opisane poniżej.

Dodatkowe przydatne polecenia obejmują:

Systemctl jest włączony.
Systemctl jest aktywny
systemctl uruchamia ponownie uruchamianie

Więcej można znaleźć w odnośniku powyżej.



Wersja CLI (wiersza poleceń)

W tym opisie założono, że działasz z katalogu domowego zamiast / home / john, w razie potrzeby korzystasz z sudo, a także z twojego edytora, w którym piszę vim lub svim.

Utwórz skrypty powłoki uruchamiania i zamykania w pierwszym wierszu #!/bin/shi włącz ich uruchamianie za pomocą chmod +x my_new_filename.

Utwórz dwa pliki jak wyżej lub w tym przykładzie jeden plik do obsługi zadań uruchamiania i zamykania. Wykonam skrypty w moim katalogu domowym, ale @don_crissti pokazuje kilka alternatyw w Stack Exchange .

svim /etc/systemd/system/start_and_stop.service

i skopiuj zawartość pliku:

[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

Następnie włącz usługę za pomocą polecenia:

systemctl enable start_and_stop

i uruchom ponownie system, po którym usługi będą aktywne. Polecenia systemctl is-enabled start_and_stopi systemctl is-active start_and_stopmogą być używane do monitorowania nowych usług.



Zmiana warunków wyzwalania dla zamknięcia

Przede wszystkim pliki używają otwartego lub zamkniętego środowiska wielu użytkowników, aby zainicjować uruchamianie skryptów. Poniższy plik wykorzystuje początek czterech potencjalnych procesów zamykania do inicjowania swoich skryptów. Dodanie lub usunięcie celów w linii Przed + linia WantedBy pozwoli ci na dokładniejsze rozróżnienie:

Ten plik został zaproponowany w drugiej odpowiedzi tego postu, ale nie mogłem go uruchomić, dopóki nie dodałem sekcji Instaluj.

Ponownie edytuj skrypt /etc/systemd/service/i włącz go, używając systemctl enable your_file_name. Kiedy zmieniłem cele, użyłem systemclt disable file_namepolecenia, a następnie ponownie je włączyłem, co dowiązało go do katalogów docelowych. Uruchom ponownie, a usługa będzie działać.

[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

7
łatwiej? łatwiej niż co? łatwiej niż wspinać się na Everest? każde inne opublikowane tutaj rozwiązanie jest łatwiejsze niż to ...
Fran Marzoa,

1
Wow, to kompletna i przyzwoicie napisana odpowiedź i to, co każdy powinien zrobić - problemy z nazewnictwem w /etc/rc6.d i zamieszanie wskazują, że nie są to dobre odpowiedzi. Jeśli procedura jest prosta, niekoniecznie ma moc, aby bezpiecznie osiągnąć swój cel. Zobacz sekcję [Zainstaluj] - możesz być pewien, że skrypt wykona się we właściwym czasie. Ponadto, ponieważ odpowiedź jest długa, nie oznacza to, że jest złożona! Dzięki btw, John9631, ta odpowiedź jest idealna i będzie bezcenna w tworzeniu bezpiecznych i wydajnych skryptów w krytycznym momencie misji ...
Miller the Gorilla

11
  1. Utwórz plik wykonywalny powłoki za pomocą skryptu w katalogu /etc/init.d/.

  2. Ponieważ należy to wykonać podczas zamykania lub ponownego uruchamiania, należy utworzyć linki miękkie w /etc/rc0.d/ i /etc/rc6.d

Przykład:

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/init.d/<your_file>

chmodzmienia flagi uprawnień celu łącza, które są takie same dla obu argumentów. Określenie ich obu jest zbędne.
David Foerster

2

Możesz znaleźć rozwiązanie tutaj: Zawieś / wznów wszystkie skrzynki Vagrant przy zamykaniu / uruchamianiu systemu .

Istnieje prosty skrypt inicjujący, który zawiesza wszystkie działające pola przed zamknięciem.

Instalacja

Edytuj /etc/init.d/vagrant-boxesi wklej skrypt z powyższego artykułu i zapisz. Lub pobierz go stąd i zapisz w /etc/init.d/vagrant-boxes. Na debian / ubuntu itp. Uruchom

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

Liczba 99 jest numerem kolejnym i powinna być większa niż (w moim przypadku Virtualbox numer 20, który, nawiasem mówiąc, jest domyślny w dystrybucjach Debiana). Druga liczba to sekwencja przy wyłączaniu komputera. Przede wszystkim dobrze byłoby zrobić.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.