Befehl vor dem Herunterfahren / Neustarten ausführen [duplizieren]

18

Ich habe eine Maschine, auf der ein paar vagabundierende VMs laufen. Das Problem, das ich habe, ist, dass ich manchmal vergesse, diese VM herunterzufahren, bevor ich meinen Computer herunterfahre oder neu starte. Aus diesem Grund bleibt meine Maschine mit der folgenden Meldung hängen:waiting for vboxnet0 to become free

Ich habe nach Lösungen gesucht und diese Seite gefunden:

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

Ich habe versucht, was sie zum Herunterfahren, aber es funktioniert nicht.

Ich habe eine sh-Datei für diesen Befehl geschrieben:

#!/bin/bash

cd ~/workspace/git/mediaservice
vagrant halt

irgendwelche Vorschläge?

SERPRO
quelle
4
Die Methode im Link ist gültig und funktioniert auf allen Linux-Versionen, sodass Ihr Skript falsch ist;) Der Benutzer ist beim Herunterfahren nicht bekannt, da sie vom Benutzer root ausgeführt wird. Lassen Sie das "~" fallen und machen Sie daraus einen vollständigen Pfad.
Rinzwind
Funktioniert es? Ich folgte einem ähnlichen Handbuch wie gist.github.com/ymc-geha/8416723, arbeitete aber nicht für mich am Ubuntu 14.04
user2135804 10.06.14
@ user2135804 Ich dachte, es hat funktioniert .. aber eigentlich hat es bei Vagrant nicht funktioniert .. Ich habe es mit anderen Sachen versucht und es hat gut funktioniert.
SERPRO
1
Übrigens ist der Fehler, den Sie beschreiben, hier .
Garrett
1
Wie im Fehlerbericht zu sehen, wurde dies behoben und wird in VirtualBox 4.3.29 enthalten sein.
Garrett

Antworten:

11

Wenn Ihre vagabundierenden VMs VirtualBox verwenden, können Sie / etc / default / virtualbox ändern und die folgende Zeile ändern:

SHUTDOWN_USERS=""

zu

SHUTDOWN_USERS="all"

Das hat es für mich auf Ubuntu 14.04 behoben

GaryBishop
quelle
1
Eigentlich ist ein offenes Ticket in der virtuellen Box damit verbunden. virtualbox.org/ticket/12264 . Ich würde empfehlen, SHUTDOWN_USERS=`cut -d: -f1 /etc/passwd`anstelle vonSHUTDOWN_USERS="all"
running.t
Ich bin auch auf Ubuntu 14.04 mit Vagrant mit VirtualBox, aber ich habe keine /etc/default/virtualboxDatei ...
Garrett
21

So führen Sie ein Skript beim Herunterfahren oder Neustarten aus:

  1. Speichern Sie Ihr Skript in /etc/rc6.d
  2. Mach es ausführbar: sudo chmod +x K99_script

Anmerkungen:

  • Das Skript in rc6.d muss die Erweiterung .sh haben
  • Der Name Ihres Skripts muss mit K99 beginnen, um zur richtigen Zeit ausgeführt zu werden.
  • Die Skripte in diesem Verzeichnis werden in alphabetischer Reihenfolge ausgeführt.

Quelle

Maythux
quelle
1
Tatsächlich. Es ist sehr wichtig, ihn richtig zu benennen, damit er zur richtigen Zeit ausgeführt wird.
Shivams
1
Ich habe ein Skript in /etc/rc6.d eingefügt, das beim Herunterfahren nicht ausgeführt wurde. Ich habe es in /etc/rc0.d abgelegt und es lief beim Herunterfahren. Wahrscheinlich ist rc.6 nur für einen Neustart.
Erel Segal-Halevi
2
@Erel Segal-Halevi Ich habe gerade versucht, ein K99-Skript zu /etc/rc6.d hinzuzufügen, das jedoch nicht ausgeführt wurde. Betrachtet man die anderen Skripte, erscheint eine Zeile ** fett K10reboot -> ../init.d/reboot ** Code, so dass es so aussieht, als würde ein K99-Skript NIEMALS ausgeführt werden !!
David Walker
Die Antwort von Ravi unten ist eine bessere Wahl, da Symlinks verwendet werden, um sicherzustellen, dass das Skript sowohl beim Herunterfahren als auch beim Neustart ausgeführt wird. Ich denke auch, dass die meisten Systemdateien diesen Ansatz verfolgen.
Eddie
12

So geht's mit Systemd (einfacher)

Nachdem die Ubuntu-Varianten und Mint zu systemd gewechselt sind, stellte ich fest, dass meine alten Lösungen, die auf den oben genannten basieren, weniger zufriedenstellend sind. Ich suchte im Internet, um herauszufinden, wie man es mit systemd macht, und kombinierte schließlich die Weisheit anderer und dokumentierte es als Blog-Post auf blogspot.com.au mit dem folgenden Tutorial.

Mit systemd erstellen Sie eine oder zwei Dateien, um Ihre Skripte mithilfe der folgenden Vorlagen aufzurufen, und führen einige Befehle aus. Einfach.


GUI-Version

Erstellen Sie zuerst die Skripte, die Sie beim Starten und / oder Herunterfahren ausführen möchten. Machen Sie einfach einen, wenn Sie nicht beide benötigen. Ich habe .scopening_atstart und .scfullcopy_atend erstellt.

Stellen Sie dann sicher, dass beide Programme ausführbar sind, indem Sie mit der rechten Maustaste auf die Datei klicken, Eigenschaften auswählen und sicherstellen, dass Sie unter Berechtigungen die Option Datei als Programm ausführen lassen ausgewählt haben.

Bildbeschreibung hier eingeben

Die beiden von mir erstellten Dateien füllen und speichern den Inhalt einer Ramdisk. Sie erstellen auch eine Datei in meinem Home-Verzeichnis, um zu beweisen, dass der Dienst funktioniert. Sie waren von der Form:

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

Dann öffnete ich meinen Dateimanager als root, öffnete /etc/systemd/systemund erstellte eine Datei startup.service und eine Datei save-ramdisk.service. Natürlich können Sie Ihre eigenen Namen auswählen, und generische Namen können eine Startdatei mit dem Namen johns_start.service und eine Datei zum Herunterfahren mit dem Namen johns_shutdown.service enthalten. Wählen Sie einfach keine vorhandenen Dienstnamen aus.

[Unit]
Description=Startup Applications

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

[Install]
WantedBy=multi-user.target

und

[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

Sie können dieselben Dienstdateien verwenden und meinen durch den vollständigen Pfad Ihres ausführbaren Skripts ersetzen.

Führen Sie zum Schluss für jeden Befehl den Befehl systemctl enable your_files_name aus (jedoch ohne den Suffix-Dienst). Also war mein erstersystemctl enable startup

Starten Sie den Computer einmal neu, um die Dienste zu starten. Der Startdienst wird immer dann ausgeführt, wenn systemd in das Mehrbenutzerziel eintritt, und der Stoppdienst, wenn es das Mehrbenutzerziel verlässt. Alternative Servicedateien mit unterschiedlichen Aktivierungsbedingungen werden unten beschrieben.

Zusätzliche nützliche Befehle umfassen:

Systemctl ist für den Start aktiviert.
Systemctl ist für den Start aktiv.
Systemctl startet den Start neu

Weitere Informationen finden Sie unter der obigen Referenz.



CLI (Command Line) Version

In dieser Beschreibung wird davon ausgegangen, dass Sie von Ihrem Home-Verzeichnis aus und nicht von / home / john aus arbeiten, sudo nach Bedarf verwenden und den Editor auswählen, in dem ich vim oder svim schreibe.

Erstellen Sie in der ersten Zeile Shell-Skripte zum Starten und Herunterfahren #!/bin/shund machen Sie sie mit ausführbar chmod +x my_new_filename.

Erstellen Sie zwei Dateien wie oben oder in diesem Beispiel eine Datei, um Start- und Herunterfahraufgaben zu erledigen. Ich werde Skripte in meinem Home-Verzeichnis ausführen, aber @don_crissti zeigt einige Alternativen bei Stack Exchange .

svim /etc/systemd/system/start_and_stop.service

und in den Dateiinhalt kopieren:

[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

Dann Aktivieren Sie den Dienst mit dem Befehl:

systemctl enable start_and_stop

und starten Sie Ihr System neu, wonach die Dienste aktiv sind. Die Befehle systemctl is-enabled start_and_stopund systemctl is-active start_and_stopkönnen zur Überwachung Ihrer neuen Dienste verwendet werden.



Ändern der Auslösebedingungen für das Herunterfahren

Die Dateien verwenden vor allem das Öffnen oder Schließen der Mehrbenutzerumgebung, um die Ausführung der Skripte einzuleiten. Die folgende Datei verwendet den Anfang von vier möglichen Herunterfahrprozessen, um die Skripte zu starten. Durch Hinzufügen oder Entfernen der Ziele in der Vorher-Zeile + der WantedBy-Zeile können Sie feinere Unterscheidungen treffen:

Diese Datei wurde in der zweiten Antwort dieses Beitrags vorgeschlagen , konnte jedoch erst ausgeführt werden, nachdem ich einen Installationsabschnitt hinzugefügt hatte.

Bearbeiten Sie das Skript erneut in /etc/systemd/service/und aktivieren Sie es mit systemctl enable your_file_name. Als ich die Ziele geändert habe, habe ich den systemclt disable file_nameBefehl verwendet und wieder aktiviert, wodurch er mit den Zielverzeichnissen verknüpft wurde. Starten Sie neu und der Dienst wird ausgeführt.

[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
John 9631
quelle
7
einfacher? einfacher als was? einfacher als den Everest zu besteigen? Jede andere hier veröffentlichte Lösung ist einfacher als diese ...
Fran Marzoa
Wow, das ist eine vollständige und anständige Antwort, und was jeder tun sollte - die Namensprobleme mit /etc/rc6.d und die Verwirrung zeigen, dass dies keine guten Antworten sind. Wenn ein Verfahren einfach ist, hat es nicht unbedingt die Macht, sein Ende sicher zu erreichen. Siehe Abschnitt [Installieren] - Sie können sicher sein, dass Ihr Skript zur richtigen Zeit ausgeführt wird. Da eine Antwort lang ist, heißt das nicht, dass sie komplex ist! Übrigens, John9631, diese Antwort ist perfekt und wird für die Erstellung sicherer und effizienter Skripte zu einem missionskritischen Zeitpunkt von unschätzbarem Wert sein ...
Müller, der Gorilla
11
  1. Erstellen Sie eine ausführbare Shell-Datei mit Ihrem Skript im Verzeichnis /etc/init.d/.

  2. Da dies während des Herunterfahrens oder Neustarts ausgeführt werden muss, müssen Softlinks in /etc/rc0.d/ und /etc/rc6.d erstellt werden

Beispiel:

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>
Ravi
quelle
chmodändert die Berechtigungsflags des Link-Ziels, was für beide Argumente gleich ist. Die Angabe beider ist überflüssig.
David Foerster
2

Hier finden Sie eine Lösung: Unterbrechen / Fortsetzen aller Vagrant-Boxen beim Herunterfahren / Starten des Systems .

Es gibt ein einfaches Init-Skript, das alle laufenden Boxen vor dem Herunterfahren anhält.

Installation

Bearbeiten Sie /etc/init.d/vagrant-boxesdas Skript aus dem obigen Artikel, fügen Sie es ein und speichern Sie es. Oder laden Sie es von hier herunter und speichern Sie es in /etc/init.d/vagrant-boxes. Führen Sie unter Debian / Ubuntu usw. Folgendes aus

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

Nummer 99 ist die Sequenznummer und sollte größer sein als (in meinem Fall Virtualbox Nummer 20, die übrigens die Standardeinstellung bei Debian-Distributionen ist). Die zweite Zahl ist die Reihenfolge beim Herunterfahren des Computers. Es könnte also gut sein, dies zuallererst zu tun.

milkovsky
quelle
2

Für Ubuntu 14.10 geht dir sowas RC04nichtRC99

Was ist von Grund auf zu tun?

  1. Erstellen Sie ein Skript unter /etc/init.d/scriptName
  2. Link über ln -s /etc/rc6.d/K04scriptName /etc/init.d/scriptName

Schritte, die ich durchgemacht habe

  1. Ich habe erfolglos versucht, Ubuntu - Ausführen eines Skripts beim Starten und Herunterfahren zu verwenden
  2. Ich fand Ubuntu 14.10 Shutdown-Skript mit rc0.d (rc6.d, rc.d)
  3. Ich habe von /etc/rc6.d/RC99linkName zu /etc/rc6.d/RC04linkName gewechselt und es funktioniert
Anthony Astige
quelle