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?
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 &