web-dev-qa-db-fra.com

Comment exécuter un script interactif avant l'arrêt de xserver?

Chaque fois que j'arrête ou redémarre mon ordinateur portable (Ubuntu 14.04), je voudrais exécuter un script qui vérifie si j'ai poussé mon nouveau code vers mon référentiel git distant. Si je l'ai oublié, il ouvre un terminal, demande à l'utilisateur d'entrer un message de validation et pousse les modifications. J'ai déjà fait fonctionner le script.

Maintenant, je cherche un moyen d'exécuter ce script automatiquement lorsque je ferme ou redémarre, mais avant que l'interface graphique ne se termine.

Jusqu'à présent, mon approche est avec System V Init (oui, je sais que c'est un peu daté):

Je copie mon script d'initialisation avec l'en-tête LSB dans /etc/init.d:

Sudo cp ~/git_checker /etc/init.d/

, modifiez les autorisations:

Sudo chmod a+x /etc/init.d/git_checker

et configurer des scénarios d'exécution:

Sudo update-rc.d /etc/init.d/git_checker defaults

Lorsque je teste ce script avec Sudo service git_checker start, J'obtiens l'erreur: "Échec de l'analyse des arguments: impossible d'ouvrir l'affichage:"

En le lisant, j'ai découvert que les scripts d'initialisation ne devaient pas être utilisés pour ouvrir des terminaux (comme ceci: su user -c 'x-terminal-emulator -e /home/user/git_check.sh'), car le serveur X n'est pas garanti de fonctionner lors de l'exécution des scripts d'initialisation.

Les scripts d'initialisation semblent donc être dans le mauvais sens. Y a-t-il un autre moyen? Peut-être avec upstart ou systemd?

Dans le cas de l'exécution du script au démarrage du système, je peux simplement le mettre dans les applications de démarrage. Existe-t-il quelque chose de similaire, comme des applications d'arrêt?

2
Oscillon

J'ai créé il y a quelque temps un petit script de surveillance qui appellera une fonction d'interruption une fois que le script aura détecté la tentative de l'utilisateur d'arrêter l'ordinateur. La petite modification dont il a besoin pour votre cas spécifique consiste à annuler l'action d'arrêt, à exécuter le script, puis à appeler l'arrêt.

#!/bin/bash

main()
{
  dbus-monitor --profile "interface='com.canonical.Unity.Session',type=signal,member=RebootRequested" | \
  while read -r line;
  do
#   echo $line
     grep -q '.*NameAcquired.*' <<< "$line"  && continue  #  Ignore that first line
    if [ -n "$line"  ];then
       interrupt 
    fi
  done
}

interrupt()
{ 
  # The first command will close the shutdown dialog
  qdbus com.canonical.Unity /com/canonical/Unity/Session com.canonical.Unity.Session.CancelAction
  # place call to your script bellow this comment
  zenity --info --text='Remember to Push changes to git repo'
  # Uncomment line bellow for shutdown
  # qdbus com.canonical.Unity  /com/canonical/Unity/Session com.canonical.Unity.Session.Shutdown

}

main

Ce script doit bien sûr être ajouté dans le cadre des applications de démarrage ou vous pouvez créer manuellement un fichier .desktop pour celui-ci

[~ # ~] note [~ # ~] : Ce script ne fonctionne qu'avec l'interface graphique, donc si l'utilisateur émet une commande Sudo shutdown -P now, ça ne marchera pas. Vous devez également surveiller la commande shutdown via un autre script à l'aide de pgrep shutdown Ou intégrer une autre fonction dans le script.

Par exemple, dans mon script ci-dessus, vous souhaitez ajouter cette fonction

manual_shutdown_monitor()
{
  while true 
  do
  if pgrep shutdown > /dev/null
  then
      zenity --info --text="GOT MANUAL"
  fi
  sleep 0.25
  done
}

Et puis appelez cette fonction dans main() comme ceci

manual_shutdown_monitor &
1