Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 sad ...

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 ? sad
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 ! smile

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 sad

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é ! smile
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 ? big_smile

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 smile
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 ? mad
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 ! smile
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 ! wink
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 ! cool
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 ! smile

Hors ligne