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

30

Je voudrais exécuter un .shfichier en utilisant bash à la déconnexion et à l'arrêt d'Ubuntu. J'ai parcouru le Web de haut en bas et n'ai trouvé que des correctifs pour KDE et GNOME. Le script est simple, j'ai juste besoin de savoir si je peux ajouter la ligne de code au fichier "logoff / shutdown" ou si j'ai besoin de la référencer dans un autre script.

DirtyDenimDan
la source
1
Mettez des liens symboliques vers des exécutables dans /etc/init.d dans /etc/rc0.d et /etc/rc6.d
Yet Another User
2
Veuillez envisager d'accepter la réponse mise à jour (en utilisant systemd) pour que les gens la voient en haut.
Jonathan Y.

Réponses:

18

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

Ajoutez la ligne suivante:

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

dans le /etc/lightdm/lightdm.conffichier.

Vous devez redémarrer lightdm pour que cette modification prenne effet. 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

Remarque: utilisez Ctrl+ Alt+ F7pour 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 par ordre alphabétique.
    • Le nom de votre script doit commencer par K99pour s'exécuter 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 par ordre alphabétique.
    • Le nom de votre script doit commencer par K99pour s'exécuter au bon moment.

Sources:

Radu Rădeanu
la source
4
Il est classique de nommer les scripts commençant par K«Kill» et S«Start».
kiri
Que faire si le script a besoin des privilèges sudo? Autant que je sache, les scripts /etc/rc6.d sont exécutés en tant qu'utilisateur et ne peuvent pas utiliser gksudo.
Urhixidur
1
ne fonctionne pas pour moi avec 14.04, y a-t-il un changement ou un fait important non spécifié?
Tomasb
2
Le conseil K99 n'est pas bon pour l'arrêt / le redémarrage si vous souhaitez enregistrer certaines données car cela se produit APRÈS le démontage ET K est utilisé pour désactiver le script (voir /etc/rcS.d/README), utilisez S pour démarrer et placez-le avant le démontage, pour le démarrage, placez votre script après le montage, coincé là-dessus parce que cette désinformation, résolue avec S comme première lettre
tomasb
6
C'est très faux: i) les noms de script doivent commencer par un Kpour les niveaux d'exécution 0, 1 et 6 et Spour les niveaux d'exécution 2, 3, 4 et 5; ii) vous n'avez pas besoin d'appeler le script K99_foo, le nombre détermine simplement l'ordre dans lequel les scripts sont exécutés. Vous devez en choisir un qui est plus grand que les autres si vous voulez qu'il soit exécuté en dernier; iii) Le niveau d' exécution 0 n'est pas destiné au redémarrage! ; C'est pour l'arrêt. 6 est pour le redémarrage. iv) les scripts n'ont rien à faire dans les /etc/rcN.drépertoires. Ils devraient plutôt être intégrés /etc/init.det liés à /etc/rcN.d.
terdon
14

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'ai eu des problèmes avec l'ancienne approche alors j'ai fait des recherches sur la manière systémique.

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


Version GUI

Créez d' abord 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 à la fois exécutable en cliquant droit sur le fichier, la sélection des propriétés et faire en sorte que, dans les autorisations, vous avez coché Autoriser l' exécution du fichier comme un programme.

Les deux fichiers que j'ai créés remplissent et enregistrent le contenu d'un disque virtuel. 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

J'ai ensuite ouvert mon gestionnaire de fichiers en tant que root, ouvert /etc/systemd/systemet 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. Ne choisissez pas les noms de service 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 substituant le chemin complet de votre script exécutable au mien.

Enfin pour chacun, exécutez la commande systemctl activez votre_nom_fichier (mais sans le service de suffixe). Donc ma première étaitsystemctl 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 entre dans la cible multi-utilisateurs et le service d'arrêt lorsqu'il quitte 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 à partir de votre répertoire personnel plutôt que / home / john, utilisez sudo au besoin et votre choix d'éditeur où j'écris vim ou svim.

Créez des scripts shell de démarrage et d'arrêt avec la première ligne #!/bin/shet 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 a montré quelques alternatives sur Stack Exchange.

svim /etc/systemd/system/start_and_stop.service

et copiez 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

Activez ensuite 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_stopet systemctl is-active start_and_stoppeuvent ê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. L'ajout ou la suppression des cibles sur la ligne Avant + la ligne WantedBy vous permettra de faire des distinctions plus fines:

Ce fichier a été proposé dans une réponse à Unix et Linux par @Matthias mais je n'ai pas pu le faire fonctionner avant d'avoir ajouté une section d'installation.

Encore une fois, modifiez le script /etc/systemd/service/et activez-le à l'aide de systemctl enable your_file_name. Lorsque j'ai changé les cibles, j'ai utilisé la systemclt disable file_namecommande, puis je l'ai réactivée, ce qui l'a liée 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
John 9631
la source
1
Bien que votre message soit correct, je suggère de l'améliorer en ajoutant un exemple de la façon dont ces étapes peuvent être effectuées avec les systèmes. Veuillez me le faire savoir une fois que vous avez modifié votre message. Merci et bienvenue à AskUbuntu
Sergiy Kolodyazhnyy
Salut Serg, voulez-vous dire des exemples tels que dans le post lié ou aviez-vous autre chose en tête? Deuxièmement, je ne sais pas comment "vous faire savoir" car je ne trouve pas de mécanisme pour contacter un autre utilisateur SO.
John 9631
Oui, vous pouvez fournir un exemple identique à celui de votre autre article. Dire simplement "aller à cet autre lien" n'est pas très bon et rend votre réponse paresseuse. Aussi pour contacter un autre utilisateur SO, utilisez @ avant le nom d'utilisateur, par exemple @Serg
Sergiy Kolodyazhnyy
Très amélioré. Très bien, continuez votre bon travail!
Sergiy Kolodyazhnyy
1
selon man systemd.unitles fichiers créés par les utilisateurs peuvent être placés dans $XDG_CONFIG_HOME/systemd/useret d'autres emplacements d'utilisateurs locaux
Antonios Hadjigeorgalis