Pages : 1
#1 Le 18/06/2009, à 16:14
- alxsal
Script de fermeture dans rc0.d ne s'execute pas
Bonjour,
Voila 2 jours que j'épluche le forum pour faire fonctionner un script à la fermeture de Ubuntu...
... mais je n'y arrive pas ...
But:
Lancer un script lors de la fermeture d'Ubuntu qui lance le logiciel unison pour sauvegarder le contenu de certains dossiers de ~ dans un disque dur externe branché en permanence.
Methode employée jusqu'ici:
1)Création du script (zalexunison) dans /etc/init.d
#!/bin/sh
. /lib/lsb/init-functions
case "$1" in
start)
;;
stop)
log_begin_msg "Alex lance la sauvegarde .. soyez patient !"
unison -batch -silent -force /home/celine
log_end_msg 0
;;
esac
exit 0
2)Rendre le script exécutable : sudo chmod a+x zalexunison
3)Créer un lien symbolique vers les dossiers /etc/rc0.d :
J'utilise la méthode recommandée avec update-rc.d :
celine@celine-desktop:/etc/init.d$ sudo update-rc.d zalexunison defaults
update-rc.d: warning: /etc/init.d/zalexunison missing LSB information
update-rc.d: see <http://wiki.debian.org/LSBInitScripts>
Adding system startup for /etc/init.d/zalexunison ...
/etc/rc0.d/K20zalexunison -> ../init.d/zalexunison
/etc/rc1.d/K20zalexunison -> ../init.d/zalexunison
/etc/rc6.d/K20zalexunison -> ../init.d/zalexunison
/etc/rc2.d/S20zalexunison -> ../init.d/zalexunison
/etc/rc3.d/S20zalexunison -> ../init.d/zalexunison
/etc/rc4.d/S20zalexunison -> ../init.d/zalexunison
/etc/rc5.d/S20zalexunison -> ../init.d/zalexunison
4)C'est sensé être tout, mais quand j'éteind l'ordinateur (à la souris clic>Eteindre), le script ne semble pas se lancer (durée de fermeture normal, pas de message.... rien d'inhabituel)
5)Vérifications après avoir rallumé l'ordinateur :
- Le fichier ~/unison/unison.log : Le programme unison n'a effectivement pas été lancé.
- Lancer le script "à la main" : sudo /etc/init.d/zalexunison stop : Le script s'exécute normalement et lance bien unison qui s'execute normalement et rend la main en fin de tache. (Argument stop car j'ai compris que lors de la fermeture de l'ordinateur, les scripts dans rc0.d sont exécutés dans l'ordre K puis S, tous avec l'argument stop)
- Les liens : dans /etc/rc0.d : le lien symbolique existe bien : K20zalexunison
Question : Pourquoi le script ne se lance-t-il pas lorsque j'éteins l'ordinateur ?
Question subsidiaire : Que signifie "update-rc.d: warning: /etc/init.d/zalexunison missing LSB information", message reçu lors de la création des liens par update-rc.d.
Déjà consulté :
http://forum.ubuntu-fr.org/viewtopic.php?id=265373
http://forum.ubuntu-fr.org/viewtopic.php?id=145658
http://forum.ubuntu-fr.org/viewtopic.ph … 960#p21960
http://refspecs.freestandards.org/LSB_3 … sinit.html (j'y comprends rien)
Hors ligne
#2 Le 18/06/2009, à 17:43
- Peck
Re : Script de fermeture dans rc0.d ne s'execute pas
Les LSB informations sont des commentaires en début de script pour donner des informations aux script de gestions de init.d.
Est-ce bien le script qui ne se lance pas et pas unison ?
Toujours mettre des chemins absolus dans les scripts car tu ne connais pas le PATH qui sera là au moment de l'exécution.
Hors ligne
#3 Le 18/06/2009, à 17:46
- NooP
Re : Script de fermeture dans rc0.d ne s'execute pas
Bonjour,
Quand on arrête un système Unix, on lance le niveau 0
Donc, si tu veux que ton script marche quand tu passes en level 0 il faut mettre les commandes à exécuter dans la partie start ...
#!/bin/sh
. /lib/lsb/init-functions
case "$1" in
start)
log_begin_msg "Alex lance la sauvegarde .. soyez patient !"
unison -batch -silent -force /home/celine
log_end_msg 0
;;
stop)
;;
esac
exit 0
En résumé :
start) Quand on entre dans le niveau en question
stop) Quand on quitte ce niveau
Exemple :
Si depuis ta session (niveau 2), tu fais un init 1 :
Tu vas exécuter tous les stop du niveau 2 (K....)
Tu vas ensuite exécuter les start du niveau 1 (S...)
Dernière modification par NooP (Le 18/06/2009, à 17:50)
Votez Macron, vous l'aurez dans le fion !
Hors ligne
#4 Le 18/06/2009, à 18:25
- alxsal
Re : Script de fermeture dans rc0.d ne s'execute pas
Merci Peck et Merci NooP !
Pour Peck:
1) Chemin absolu : ok j'ai changé mon script --> voir à la fin du msg. Mais ça ne marche toujours pas avec ces chemins absolus.
2) Script ou Unison ? Je pense que c'est bien le script qui ne se lance pas car quand je fais sudo /etc/init.d/zalexunison stop, le script s'exécute et lance bien unison. J'avais d'autre part mis dans mon script un log_begin_msg "Alex lance la sauvegarde .. soyez patient !" en me disant que je le verrai bien apparaitre quelque part si le script se lançait...
Cependant, y a-t-il un moyen sûr de savoir si le script a été ou non exécuté ? (flag/autre?)
Pour NooP:
J'ai essayé ta proposition de script modifié, donc en mettant l'appel à unison sous start), et en gardant le même nom de lien (K20zalexunison) => mais pas de changement. J'ai ensuite essayé en créant un second lien (S20zalexunison), avec l'appel à unison sous start) => toujours pas
Mon script actuel est donc :
#!/bin/sh
. /lib/lsb/init-functions
case "$1" in
start)
log_begin_msg "Alex lance la sauvegarde .. soyez patient !"
/usr/bin/unison -batch -silent -force /home/celine
log_end_msg 0
;;
stop)
;;
esac
exit 0
Mais la doc que j'ai regardé indique que
- Pour les niveaux 2,3,4,5, l'entrée dans le niveau lançait les K** avec stop et les S** avec start
- Pour les niveaux 0,6, l'entrée dans le niveau lançait les K** et les S** avec stop
Donc il faudrait que je remette la commande "unison" dans "case stop)", non ?
Avez vous d'autres idées ?
Hors ligne
#5 Le 18/06/2009, à 18:29
- NooP
Re : Script de fermeture dans rc0.d ne s'execute pas
Votez Macron, vous l'aurez dans le fion !
Hors ligne
#6 Le 18/06/2009, à 19:03
- alxsal
Re : Script de fermeture dans rc0.d ne s'execute pas
Je viens de lire ton lien sur les runlevels NooP, merci.
J'ai bien modifié mon script en mettant l'appel à unison dans la partie "start)", mais ça ne marche toujours pas.
Je viens de retrouver la référence qui dit que :
The links starting with K will cause the referred-to file to be executed with an argument of stop, and the S links with an argument of start.
The two runlevels 0 (halt) and 6 (reboot) are slightly different. In these runlevels, the links with an S prefix are still called after those with a K prefix, but they too are called with the single argument stop.
C'est dans http://www.debian.org/doc/debian-policy … s-sysvinit
Mon script est toujours comme tu me l'as suggéré (unison dans start), et n'est toujours pas executé. As tu des idées sur le problème ?
Hors ligne
#7 Le 18/06/2009, à 23:12
- Peck
Re : Script de fermeture dans rc0.d ne s'execute pas
Les K et les S sont tous les 2 exécutés quand tu rentre dans un runlevel. La différence tient à l'ordre et au paramètre start ou stop qui est donné.
Pour la fonction log_begin_msg je ne la connais pas bien, donc je ne peux pas te dire ce qu'elle fait exactement, mais je suppose qu'elle écrit dans un fichier dans /var/log (au hasard syslog).
A vérifier :
- ls -l /etc/init.d (s'il y a des différences entre ton script et d'autres ca doit se voir)
- ls -l /etc/rc0.d (pareil)
Essaie de changer de shell avant de lancer ton script à la main pour voir si ça a une influence.
Fait un touch /root/toto au tout début du script pour voir s'il est vraiment exécuté
Hors ligne
#8 Le 18/06/2009, à 23:49
- alxsal
Re : Script de fermeture dans rc0.d ne s'execute pas
Merci Peck !
Resultat des commandes :
> ls -l /etc/init.d (juste la fin qui contient mon script)
-rwxr-xr-x 1 root root 2964 2009-02-08 00:12 usplash
-rwxr-xr-x 1 root root 2327 2009-04-09 03:43 wpa-ifupdown
-rwxr-xr-x 1 root root 1777 2008-12-05 01:44 x11-common
-rwxr-xr-x 1 root root 185 2009-06-18 21:20 zalexunison
-rwxr-xr-x 1 root root 220 2009-06-18 18:07 zalexunison~
ls -l /etc/rc0.d (juste le début ...)
lrwxrwxrwx 1 root root 13 2009-06-15 15:10 K01gdm -> ../init.d/gdm
lrwxrwxrwx 1 root root 17 2009-06-15 15:10 K02usplash -> ../init.d/usplash
lrwxrwxrwx 1 root root 16 2009-06-15 15:10 K20apport -> ../init.d/apport
lrwxrwxrwx 1 root root 21 2009-06-18 15:40 K20zalexunison -> ../init.d/zalexunison
lrwxrwxrwx 1 root root 20 2009-06-15 15:10 K25hwclock.sh -> ../init.d/hwclock.sh
Rien qui me choque ... et toi ?
Je vais essayer le
>touch (merci pour le "truc" pour savoir si le script est executé !
En revanche pour le "changement de shell", je ne comprends pas ce qu'il faut faire...
... faire >chsh dash puis relancer le script à la main c'est ça ?
Hors ligne
#9 Le 19/06/2009, à 00:14
- alxsal
Re : Script de fermeture dans rc0.d ne s'execute pas
Oui !
Le touch /home/celine/Duke.doc mis au debut de la boucle start) du script a touché !
Le fichier a été mis à l'heure
>-rwxrwxrwx 1 celine celine 66048 2009-06-18 23:59 Duke.doc
Donc le script s'execute bien
Mais alors Pourquoi le lancement à la main
>sudo /etc/init.d/zalexunison start
lance bien la commande unison
Alors que le lancement "automatique à la fermeture" par le K20zalexunison
lance le touch, mais pas de trace du lancement d'unison !
Pourquoi ?
Comment savoir si l'appel à unison donne une erreur ?
Si je lançais un programme qui demande des entrées de ma part (confirmation/input...) est-ce qu'un terminal s'ouvrirait automatiquement ? Faudrait-il en invoquer un ?
Mon script est maintenant comme suit :
#!/bin/sh
. /lib/lsb/init-functions
case "$1" in
start)
touch /home/celine/Duke.doc
log_begin_msg "Alex lance la sauvegarde .. soyez patient !"
/usr/bin/unison
log_end_msg 0
;;
stop)
;;
esac
exit 0
Hors ligne
#10 Le 19/06/2009, à 07:21
- Peck
Re : Script de fermeture dans rc0.d ne s'execute pas
Mets ta ligne en
/usr/bin/unison > /root/test 2>&1
Tu auras les messages d'erreur
Hors ligne
#11 Le 19/06/2009, à 10:38
- alxsal
Re : Script de fermeture dans rc0.d ne s'execute pas
Ca avance !
1) J'ai suivi ton indication et modifié l'appel à unison en
/usr/bin/unison > /root/test 2>&1 ... et ça donne
>cat test
Fatal error: exception Util.Fatal("Environment variable HOME not found")
2) J'ai aussi ajouté une ligne au script
env > testenv .... et ça donne
>cat testenv
runlevel=2
UPSTART_JOB=rc2
UPSTART_JOB_ID=6
TERM=linux
PATH=/sbin:/usr/sbin:/bin:/usr/bin
RUNLEVEL=2
PREVLEVEL=N
UPSTART_EVENT=runlevel
PWD=/
previous=N
VERBOSE=no
... Et je ne sais pas du tout ce que ça veut dire, ni comment corriger le problème...:D
Des idées ?
Hors ligne
#12 Le 19/06/2009, à 14:14
- Peck
Re : Script de fermeture dans rc0.d ne s'execute pas
bah l'utilisateur qui lance le script n'a pas de variable home.
Donc il faut la forcer dans le script.
Hors ligne
#13 Le 19/06/2009, à 16:46
- alxsal
Re : Script de fermeture dans rc0.d ne s'execute pas
Ca marche ... avec une dernière modification !
Suivant les explications de Peck, j'ai forcé la variable d'environnement HOME dans le script :
>export HOME=/home/celine
Le script s'exécute alors sans erreur, mais il s'exécute non à l'extinction de l'ordinateur, mais quand je rallume l'ordinateur !
Donc je remodifie mon script pour mettre l'appel à unison dans la partie stop) du "case"
... et ça marche !
Ca confirme donc que lors de l'extinction de l'ordinateur, les liens présents dans rc0.d sont appelés avec l'argument stop ! (et non start comme le suggérait NooP)
En résumé, pour ceux que ça interesse, pour avoir un script qui lance automatiquement unison afin de sauvegarder le contenu de ~/Documents sur un disque dur externe, la procédure décrite dans le message #1 marche, mais avec un script modifié comme suit :
ls#!/bin/sh
. /lib/lsb/init-functions
case "$1" in
start)
;;
stop)
export HOME=/home/celine
/usr/bin/unison
;;
esac
exit 0
Avec un fichier ~/.unison/default.prf pour unison qui est comme suit :
# Unison preferences file
root = /home/celine
root = /media/disk/unison
#preferences
force = /home/celine
batch = true
#Paths to synchronize
path = Documents
Voilà, reste à mettre des options dans le fichier default.prf pour créer un backup des fichiers supprimés et éviter ainsi de propager une suppression par erreur.... je vais y travailler
MERCI Peck et NooP !
Hors ligne
Pages : 1