web-dev-qa-db-fra.com

Exécuter la commande avant l'arrêt / le redémarrage

J'ai une machine qui exécute deux ou trois ordinateurs virtuels vagabonds. Le problème que j’ai, c’est que j’oublie parfois d’arrêter ces VM avant d’arrêter ou de redémarrer mon ordinateur. A cause de cela, mon ordinateur est bloqué par le message suivant: waiting for vboxnet0 to become free

J'ai cherché des solutions et j'ai trouvé cette page:

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

J'ai essayé ce qu'ils voulaient pour arrêter, mais cela ne fonctionne pas.

J'ai écrit un fichier sh pour cette commande:

#!/bin/bash

cd ~/workspace/git/mediaservice
vagrant halt

aucune suggestion?

17
SERPRO

Si vos machines virtuelles vagabondes utilisent VirtualBox, vous pouvez modifier/etc/default/virtualbox et modifier la ligne qui se lit comme suit:

SHUTDOWN_USERS=""

à

SHUTDOWN_USERS="all"

Cela a résolu le problème pour moi sur Ubuntu 14.04

11
GaryBishop

Pour exécuter un script à l’arrêt ou au redémarrage:

  1. sauvegardez votre script dans /etc/rc6.d
  2. Rendez-le exécutable: Sudo chmod +x K99_script

Remarques:

  • Le script dans rc6.d doit être sans extension .sh
  • Le nom de votre script doit commencer par K99 pour s'exécuter au bon moment.
  • Les scripts de ce répertoire sont exécutés dans l'ordre alphabétique.

source

21
Maythux

Comment le faire avec Systemd (c'est plus facile)

Maintenant que les variantes Ubuntu et Mint ont migré vers systemd, mes anciennes solutions basées sur ce qui précède sont moins satisfaisantes. J'ai fait des recherches sur le Web pour savoir comment procéder avec systemd et j'ai fini par combiner la sagesse des autres et la documenter sous forme de publication sur un blog à l'adresse blogspot.com.a contenant le didacticiel suivant.

Avec systemd, vous créez un ou deux fichiers pour appeler vos scripts à l'aide des modèles ci-dessous, puis vous exécutez quelques commandes. Simple.


Version graphique

Créez tout d'abord les scripts que vous souhaitez exécuter au démarrage et/ou à l'arrêt. Faites juste un si vous n'avez pas besoin des deux. J'ai créé .scopening_atstart et .scfullcopy_atend.

Puis assurez-vous qu'ils sont tous deux exécutables en cliquant avec le bouton droit de la souris sur le fichier, en sélectionnant les propriétés et en vous assurant que, sous autorisations, vous avez coché Autoriser l'exécution du fichier en tant que programme.

enter image description here

Les deux fichiers que j'ai créés peuplent et enregistrent le contenu d'un disque mémoire. Ils créent également un fichier dans mon répertoire personnel pour prouver que le service fonctionne. Ils étaient de la forme:

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

Puis j'ai ouvert mon gestionnaire de fichiers en tant que root, ouvert /etc/systemd/system et créé un fichier startup.service et un fichier save-ramdisk.service. Évidemment, vous pouvez choisir vos propres noms et les noms génériques auraient pu inclure un fichier de démarrage appelé johns_start.service et un fichier d'arrêt appelé johns_shutdown.service. Il suffit de ne pas choisir les noms de services existants.

[Unit]
Description=Startup Applications

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

[Install]
WantedBy=multi-user.target

et

[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

Vous pouvez utiliser les mêmes fichiers de service, en remplaçant le chemin complet de votre script exécutable par le mien.

Enfin pour chacun d'eux, exécutez la commande systemctl enable your_files_name (mais sans le service de suffixe). Donc, mon premier était systemctl enable startup

Redémarrez l'ordinateur une fois pour démarrer les services. Le service de démarrage sera exécuté chaque fois que systemd entrera dans la cible multi-utilisateurs et le service d'arrêt lorsqu'il quittera la cible multi-utilisateurs. Des fichiers de service alternatifs avec différentes conditions d'activation seront décrits ci-dessous.

Les commandes utiles supplémentaires incluent:

démarrage de systemctl est activé
systemctl est un démarrage actif
redémarrage du système

Plus peut être trouvé à la référence ci-dessus.



Version CLI (ligne de commande)

Cette description suppose que vous opérez depuis votre répertoire personnel plutôt que/home/john, utilisez Sudo selon vos besoins et votre choix d'éditeur dans lequel j'écris vim ou svim.

Créez des scripts de shell de démarrage et d'arrêt avec la première ligne #!/bin/sh et rendez-les exécutables à l'aide de chmod +x my_new_filename.

Créez deux fichiers comme ci-dessus ou, dans cet exemple, un fichier pour gérer les tâches de démarrage et d'arrêt. J'exécuterai des scripts dans mon répertoire personnel mais @don_crissti montre quelques alternatives à Stack Exchange .

svim /etc/systemd/system/start_and_stop.service

et copier dans le contenu du fichier:

[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

Puis Activez le service avec la commande:

systemctl enable start_and_stop

et redémarrez votre système après quoi les services seront actifs. Les commandes systemctl is-enabled start_and_stop et systemctl is-active start_and_stop peuvent être utilisées pour surveiller vos nouveaux services.



Modification des conditions de déclenchement pour l’arrêt

Les fichiers utilisent avant tout l’ouverture ou la fermeture de l’environnement multi-utilisateur pour lancer l’exécution des scripts. Le fichier ci-dessous utilise le début de quatre processus d'arrêt potentiels pour lancer ses scripts. Ajouter ou supprimer les cibles sur la ligne Avant + la ligne WantedBy vous permettra d’établir des distinctions plus précises:

Ce fichier a été proposé dans la deuxième réponse de cet article , mais je n’ai pas pu le faire fonctionner avant d’ajouter une section d’installation.

Là encore, éditez le script dans /etc/systemd/service/ et activez-le avec systemctl enable your_file_name. Lorsque j'ai changé les cibles, j'ai utilisé la commande systemclt disable file_name, puis je l'ai réactivée, ce qui l'a lié symboliquement aux répertoires cibles. Redémarrez et le service sera opérationnel.

[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
11
John 9631
  1. Créez un fichier exécutable Shell avec votre script dans le répertoire /etc/init.d/.

  2. Comme cela doit être exécuté pendant l’arrêt ou le redémarrage, il faut créer des liens symboliques dans /etc/rc0.d/ et /etc/rc6.d

Exemple:

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>
11
Ravi

Pour Ubuntu 14.10, vous avez quelque chose comme RC04 not RC99

Que faire à partir de zéro

  1. Créez un script à /etc/init.d/scriptName
  2. Lien via ln -s /etc/rc6.d/K04scriptName /etc/init.d/scriptName

Étapes que j'ai parcourues

  1. J'ai essayé sans succès d'utiliser buntu - Exécution d'un script au démarrage et à l'arrêt
  2. J'ai trouvé script d'arrêt Ubuntu 14.10 avec rc0.d (rc6.d, rc.d)
  3. J'ai changé de /etc/rc6.d/RC99linkName à /etc/rc6.d/RC04linkName et cela fonctionne
2
Anthony Astige

Vous pouvez trouver une solution ici: Suspendre/reprendre toutes les boîtes Vagrant à l’arrêt/au démarrage du système .

Il existe un simple script d'initialisation qui suspend toutes les boîtes en cours avant de s'éteindre.

Installation

Éditez /etc/init.d/vagrant-boxes et collez le script de l'article ci-dessus et enregistrez. Ou téléchargez-le ici et enregistrez-le dans /etc/init.d/vagrant-boxes. Sur debian/ubuntu, etc., lancez

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

Le numéro 99 est le numéro de séquence et devrait être supérieur à (dans mon cas, le numéro 20 de Virtualbox, qui est d'ailleurs la valeur par défaut sur les distributions Debian). Le deuxième numéro correspond à la séquence lors de l’arrêt de l’ordinateur. Donc, il serait peut-être bon de commencer par le faire.

2
milkovsky