Esegui comando prima dell'arresto / riavvio [duplicato]


19

Ho una macchina con un paio di macchine virtuali vagabonde. Il problema che ho è che a volte dimentico di spegnere quelle VM prima di spegnere o riavviare il mio computer. Per questo motivo la mia macchina si blocca con questo messaggio:waiting for vboxnet0 to become free

Ho cercato soluzioni e ho trovato questa pagina:

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

Ho provato quello che hanno spento, ma non funziona.

Ho scritto un file sh per quel comando:

#!/bin/bash

cd ~/workspace/git/mediaservice
vagrant halt

eventuali suggerimenti?


4
Il metodo nel collegamento è valido e funziona su tutte le versioni di Linux, quindi lo script è sbagliato;) L'utente non è noto allo spegnimento poiché è eseguito dall'utente root. Quindi rilascia "~" e rendilo un percorso completo.
Rinzwind

Funziona? Ho seguito un manuel simile come gist.github.com/ymc-geha/8416723 ma non ha funzionato per me su Ubuntu 14.04
user2135804

@ user2135804 Ho pensato che funzionasse .. ma in realtà non ha funzionato per Vagrant .. Ho provato con altre cose e ha funzionato bene.
SERPRO,

1
A proposito, il bug che stai descrivendo è qui .
Garrett,

1
Come visto nella segnalazione dei bug, questo è stato risolto e sarà incluso con VirtualBox 4.3.29.
Garrett,

Risposte:


12

Se le tue VM vagabonde utilizzano VirtualBox, puoi modificare / etc / default / virtualbox e cambiare la riga che legge:

SHUTDOWN_USERS=""

per

SHUTDOWN_USERS="all"

Ciò mi ha risolto il problema con Ubuntu 14.04


1
In realtà c'è un ticket aperto nella scatola virtuale collegato a questo. virtualbox.org/ticket/12264 . Vorrei suggerire di utilizzare SHUTDOWN_USERS=`cut -d: -f1 /etc/passwd`invece diSHUTDOWN_USERS="all"
running.t

Sono anche su Ubuntu 14.04 con Vagrant usando VirtualBox, ma non ho alcun /etc/default/virtualboxfile ...
Garrett

21

Per eseguire uno script all'arresto o al riavvio:

  1. salva il tuo script in /etc/rc6.d
  2. Renderlo eseguibile: sudo chmod +x K99_script

Appunti:

  • Lo script in rc6.d deve avere un'estensione .sh
  • Il nome del tuo script deve iniziare con K99 per essere eseguito al momento giusto.
  • Gli script in questa directory vengono eseguiti in ordine alfabetico.

fonte


1
Infatti. È molto importante nominarlo correttamente in modo che venga eseguito al momento giusto.
Shivams,

2
Ho inserito uno script in /etc/rc6.d e non è stato eseguito allo spegnimento. L'ho messo in /etc/rc0.d ed è stato eseguito allo spegnimento. Probabilmente, rc.6 è solo per il riavvio.
Erel Segal-Halevi,

2
@Erel Segal-Halevi Ho appena provato ad aggiungere uno script K99 a /etc/rc6.d e non è stato eseguito. Guardando gli altri script, c'è una riga ** grassetto K10reboot -> ../init.d/reboot ** code, quindi sembra che uno script K99 NON verrà mai eseguito !!
David Walker,

La risposta di Ravi di seguito è una scelta migliore perché utilizza collegamenti simbolici per garantire l'esecuzione dello script sia allo spegnimento che al riavvio. Penso anche che la maggior parte dei file di sistema tendano ad adottare questo approccio.
Eddie,

rc.6 sembra essere solo per il riavvio, come altri menzionati. Vedi
Aelian il

12

Come farlo con Systemd (è più facile)

Ora che le varianti di Ubuntu e Mint sono passate a systemd ho trovato le mie vecchie soluzioni basate su quelle precedenti meno soddisfacenti. Ho cercato sul Web per scoprire come farlo con systemd e ho finito per combinare la saggezza degli altri e documentarlo come post di blog su blogspot.com.au contenente il seguente tutorial.

Con systemd crei uno o due file per chiamare i tuoi script utilizzando i modelli seguenti ed esegui un paio di comandi. Semplice.


Versione GUI

Innanzitutto creare gli script che si desidera eseguire all'avvio e / o allo spegnimento. Fallo solo se non hai bisogno di entrambi. Ho creato .scopening_atstart e .scfullcopy_atend.

Poi assicurati che siano entrambi eseguibili facendo clic con il pulsante destro del mouse sul file, selezionando le proprietà e assicurandoti che, sotto le autorizzazioni, hai selezionato Consenti l'esecuzione del file come programma.

inserisci qui la descrizione dell'immagine

I due file che ho creato popolano e salvano il contenuto di un ramdisk. Inoltre creano un file nella mia home directory per dimostrare che il servizio funziona. Erano della 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

Quindi ho aperto il mio file manager come root, aperto/etc/systemd/system e creato un file startup.service e un file save-ramdisk.service. Ovviamente puoi scegliere i tuoi nomi e nomi generici potrebbero aver incluso un file di avvio chiamato johns_start.service e un file di arresto chiamato johns_shutdown.service. Basta non scegliere i nomi dei servizi esistenti.

[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

È possibile utilizzare gli stessi file di servizio, sostituendo il mio percorso completo con il mio script eseguibile.

Infine per ognuno eseguire il comando systemctl abilita your_files_name (ma senza il servizio suffisso). Quindi il mio primo è statosystemctl enable startup

Riavvia il computer una volta per avviare i servizi. Il servizio di avvio verrà eseguito ogni volta che systemd entra nella destinazione multiutente e il servizio di arresto quando esce dalla destinazione multiutente. Di seguito verranno descritti file di servizio alternativi con condizioni di attivazione diverse.

Ulteriori comandi utili includono:

systemctl è l'avvio abilitato
systemctl è l'avvio attivo
systemctl riavvio avvio

Maggiori informazioni sono disponibili al riferimento sopra.



Versione CLI (riga di comando)

Questa descrizione presuppone che tu operi dalla tua directory home piuttosto che / home / john, usi sudo secondo necessità e la tua scelta dell'editor dove scrivo vim o svim.

Crea script shell di avvio e spegnimento con la prima riga #!/bin/she rendili eseguibili usando chmod +x my_new_filename.

Creare due file come sopra o, in questo esempio, un file per gestire le attività di avvio e arresto. Eseguirò gli script nella mia directory home ma @don_crissti mostra alcune alternative a Stack Exchange .

svim /etc/systemd/system/start_and_stop.service

e copia nel contenuto del file:

[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

Quindi abilitare il servizio con il comando:

systemctl enable start_and_stop

e riavviare il sistema dopo il quale i servizi saranno attivi. I comandi systemctl is-enabled start_and_stope systemctl is-active start_and_stoppossono essere utilizzati nel monitoraggio dei nuovi servizi.



Modifica delle condizioni di trigger per l'arresto

I file utilizzano soprattutto l'apertura o la chiusura dell'ambiente multiutente per avviare l'esecuzione degli script. Il file seguente utilizza l'inizio di quattro potenziali processi di arresto per avviare i suoi script. L'aggiunta o la rimozione dei target nella riga Prima + la riga WantedBy ti consentirà di fare distinzioni più precise:

Questo file è stato proposto nella seconda risposta di questo post ma non sono stato in grado di farlo funzionare fino a quando non ho aggiunto una sezione di installazione.

Ancora una volta, modifica lo script /etc/systemd/service/e abilitalo usando systemctl enable your_file_name. Quando ho cambiato le destinazioni ho usato il systemclt disable file_namecomando e poi l'ho riattivato, che lo collegava alle directory di destinazione. Riavvia e il servizio sarà operativo.

[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
Più facile? più facile di cosa? più facile che scalare l'Everest? ogni altra soluzione pubblicata qui è più semplice di questa ...
Fran Marzoa,

1
Wow, questa è una risposta completa e decentemente scritta, e ciò che tutti dovrebbero fare - i problemi di denominazione con /etc/rc6.d e la confusione indicano che quelle non sono buone risposte. Se una procedura è semplice, non ha necessariamente il potere di raggiungere in sicurezza la sua fine. Vedi la sezione [Installa] - puoi essere certo che il tuo script verrà eseguito al momento giusto. Inoltre, poiché una risposta è lunga, ciò non significa che sia complesso! Grazie, John9631, questa risposta è perfetta e sarà preziosa per la creazione di script sicuri ed efficienti in un momento critico della missione ...
muta il gorilla il

11
  1. Creare un file eseguibile della shell con lo script nella directory /etc/init.d/.

  2. Dal momento che questo deve essere eseguito durante l'arresto o il riavvio è necessario creare softlink in /etc/rc0.d/ e /etc/rc6.d

Esempio:

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>

chmodcambia i flag di autorizzazione della destinazione del collegamento, che è lo stesso per entrambi gli argomenti. Specificandoli entrambi è ridondante.
David Foerster,

2

Puoi trovare una soluzione qui: sospendi / ripristina tutte le caselle Vagrant all'arresto / avvio del sistema .

Esiste un semplice script init che sospende tutte le caselle in esecuzione prima di spegnersi.

Installazione

Modifica /etc/init.d/vagrant-boxese incolla lo script dall'articolo precedente e salva. Oppure scaricalo da qui e salvalo in /etc/init.d/vagrant-boxes. Su debian / ubuntu ecc., Eseguire

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

Il numero 99 è il numero progressivo e dovrebbe essere maggiore di (nel mio caso il numero 20 di Virtualbox, che a proposito è l'impostazione predefinita sulle distribuzioni Debian). Il secondo numero è la sequenza quando si spegne il computer. Quindi, potrebbe essere bene fare prima di tutto.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.