web-dev-qa-db-fra.com

Exécuter un script lors de la déconnexion / du redémarrage / de l'arrêt dans Ubuntu

J'aimerais exécuter un fichier .sh en utilisant bash lors de la déconnexion et de la fermeture d'Ubuntu. J'ai effectué des recherches sur le Web et n'ai trouvé que des correctifs pour KDE et GNOME. Le script est simple, je veux juste savoir si je peux ajouter la ligne de code au fichier "logoff/shutdown" ou si je dois le référencer dans un autre script.

29
DirtyDenimDan

Pour exécuter un script lors de la déconnexion:

Ajoutez la ligne suivante:

session-cleanup-script=/path/to/script

dans le fichier /etc/lightdm/lightdm.conf.

Vous devez redémarrer lightdm pour que cette modification soit prise en compte. Pour ce faire, allez dans tty1 en utilisant Ctrl+Alt+F1, connectez-vous avec votre nom d'utilisateur et votre mot de passe et exécutez la commande suivante:

Sudo service lightdm restart

Note: utiliser Ctrl+Alt+F7 passer à la session graphique

Pour exécuter un script au redémarrage:

  1. Mettez votre script dans /etc/rc0.d
  2. Rendez-le exécutable: Sudo chmod +x K99_script
  3. Remarques:
    • Les scripts de ce répertoire sont exécutés dans l'ordre alphabétique.
    • Le nom de votre script doit commencer par K99 pour être exécuté au bon moment.

Pour exécuter un script à l’arrêt:

  1. Mettez votre script dans /etc/rc6.d
  2. Rendez-le exécutable: Sudo chmod +x K99_script
  3. Remarques:
    • Les scripts de ce répertoire sont exécutés dans l'ordre alphabétique.
    • Le nom de votre script doit commencer par K99 pour être exécuté au bon moment.

Sources:

18
Radu Rădeanu

Comment le faire avec systemd

Si vous trouvez ce fil après juin 2016, Ubuntu et ses dérivés, y compris Mint, utiliseront systemd pour contrôler l’initialisation et l’arrêt du système. J'avais des problèmes avec l'ancienne approche, j'ai donc fait des recherches de manière systématique.

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


Version graphique

First créez les scripts que vous souhaitez exécuter au démarrage et/ou à l'arrêt. J'ai créé .scopening_atstart et .scfullcopy_atend.

Ensuite 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é la case Autoriser l'exécution du fichier en tant que programme.

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

Ensuite 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, 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.


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.

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

Créer 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 a montré 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

Alors Activer 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 une réponse sous Unix & Linux par @Mathias mais je n’ai pas pu le faire fonctionner tant que j’avais ajouté 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
14
John 9631