IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Exécution de script incomplète au démarrage


Sujet :

Shell et commandes GNU

  1. #1
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 122
    Points : 82
    Points
    82
    Par défaut Exécution de script incomplète au démarrage
    Bonsoir,
    J'ai un petit script que je veux exécuter au démarrage de la machine, bien qu'il ne s'exécute qu'une fois, je l'ai traité comme un service. (ce script lance une petite application java de mise à l'heure sur un équipement qui ne possède pas d'horloge sauvegardée).
    Le script /etc/init.d/horloge
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
        DAEMON="/opt/jdk1.7.0_60/bin/java"
        DAEMON_OPT="-jar /usr/local/lib/horloge.jar"  # fichier à exécuter
        NAME="horloge.jar" # Nom du programme
        PIDFILE=/var/run/$NAME.pid
     
        PATH="/sbin:/bin:/usr/sbin:/usr/bin"
        export JAVA_HOME=/opt/jdk1.7.0_60
        export PATH=${PATH}:${JAVA_HOME}/bin:${JAVA_HOME}/jre/bin
     
        test -e $DAEMON || exit 0
     
        . /lib/init/vars.sh
        . /lib/lsb/init-functions
     
        start_d () {
                log_daemon_msg "Start $NAME Daemon"
    	    start-stop-daemon --make-pidfile --start --quiet --pidfile $PIDFILE --exec $DAEMON -- $DAEMON_OPT
        }
     
    ..........
    et les liens symboliques :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    root@ubuntu:/home/hubert# update-rc.d horloge defaults
    Adding system startup for /etc/init.d/horloge ...
       /etc/rc0.d/K20horloge -> ../init.d/horloge
       /etc/rc1.d/K20horloge -> ../init.d/horloge
       /etc/rc6.d/K20horloge -> ../init.d/horloge
       /etc/rc2.d/S20horloge -> ../init.d/horloge
       /etc/rc3.d/S20horloge -> ../init.d/horloge
       /etc/rc4.d/S20horloge -> ../init.d/horloge
       /etc/rc5.d/S20horloge -> ../init.d/horloge
    Si j'exécute ce script en ligne de commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    root@ubuntu:/home/hubert# date
    Tue Jan 10 12:45:17 CET 2017
    root@ubuntu:/home/hubert# /etc/init.d/horloge start
     * Start horloge.jar Daemon                                                                                                                     root@ubuntu:/home/hubert# date
    Fri Jan 20 21:22:35 CET 2017
    J'ai bien une mise à l'heure du système; par contre lors d'un reboot si je passe bien dans le script (le fichier /run/horloge.jar.pid est créé), je n'ai pas de mise à l'heure. Comme si il y avait un problème sur le programme java : variables d'environnement ou autre?
    Des pistes à explorer?

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 377
    Points
    19 377
    Par défaut
    Bonjour,

    pourquoi faire ça en java ?
    pourquoi ne pas installer un service ntpd ?
    pourquoi ne pas appeler ntpdate depuis une crontab root avec @reboot en tant que paramètre temps?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 122
    Points : 82
    Points
    82
    Par défaut
    Bonjour,
    Citation Envoyé par N_BaH
    pourquoi faire ça en java ?
    Parce que j'ai passé près d'une journée à faire fonctionner ntpdate avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    root@ubuntu:/home/hubert# ntpdate ntp.ubuntu.com
    ntpdate: relocation error: ntpdate: symbol CRYPTO_memcmp, version OPENSSL_1.0.0 not defined in file libcrypto.so.1.0.0 with link time reference
    et comme je ne suis pas un spécialiste des entrailles du système, j'ai laissé tomber.
    J'ai OPENSSL_1.0.1 d'installé, et que je n'ai pas réussi à résoudre ce problème après divers essais.

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 377
    Points
    19 377
    Par défaut
    ta version d'Ubuntu est-elle encore sous initV ? depuis quelques temps Ubuntu utilise Systemd pour gérer le démarrage.

    tu as une trace du démarrage de ton programme java : un log ? un fichier témoin sous /tmp ?...
    qui atteste de sa non-exécution complète.

    tu as essayé de réinstaller ntpdate ?
    tu as fait un dist-upgrade ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 882
    Points
    7 882
    Par défaut
    Citation Envoyé par hapalemur Voir le message
    J'ai bien une mise à l'heure du système; par contre lors d'un reboot si je passe bien dans le script (le fichier /run/horloge.jar.pid est créé), je n'ai pas de mise à l'heure. Comme si il y avait un problème sur le programme java : variables d'environnement ou autre?
    Des pistes à explorer?
    La cause la plus probable est que ton programme s'attend à avoir un environnement graphique à sa disposition, un serveur X11 via la variable DISPLAY.

    Tu peux essayer de dire à la JVM de s'en passer, mais il n'est pas garanti que l'appli java sois d'accord:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DAEMON_OPT="-Djava.awt.headless=true -jar /usr/local/lib/horloge.jar"
    ɹǝsn *sıɹɐlos*

  6. #6
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 122
    Points : 82
    Points
    82
    Par défaut
    Merci pour la réponse.
    Citation Envoyé par N_BaH
    ta version d'Ubuntu est-elle encore sous initV ?
    Oui, c'est un système monocarte (pcDuino) avec CPU ARM.
    Citation Envoyé par N_BaH
    tu as une trace du démarrage de ton programme java : un log ?
    Non, comme celà fonctionnait en ligne de commande, j'ai supprimé les logs; il faudra les remettre
    Citation Envoyé par N_BaH
    tu as essayé de réinstaller ntpdate ?
    Oui, même problème.
    Citation Envoyé par N_BaH
    tu as fait un dist-upgrade ?
    Sans doute! mais pas habitué de cette distribution, il faudra que je vérifie.

    Système inaccessible depuis ce matin : équipement sité en "pleine nature" avec accès ADSL situé derrière un routeur Dlink. Pour une raison inconnue la connexion (http et ssh) tombe quelques temps puis revient. Pas de logs attestant un redémarrage du système sur activation du WatchDog -en phase d'étude: vérification périodique de la liaison avec un ping vers l'extérieur, en plus du WatchDog matériel-.

    @ jlliagre
    Dès que j'ai récupéré la connexion, je tente ce paramètre. Merci.

  7. #7
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 122
    Points : 82
    Points
    82
    Par défaut
    Bjr,
    Ayant récupéré la connexion sur le système (pb du vraisemblament au routeur Dlink) j'ai pu modifier le script avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DAEMON_OPT="-Djava.awt.headless=true -jar /usr/local/lib/horloge.jar"
    Le problème persiste.

  8. #8
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 882
    Points
    7 882
    Par défaut
    L'étape suivante consiste à essayer de comprendre pourquoi ton programme ne fonctionne pas, par exemple en remplaçant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    start-stop-daemon --make-pidfile --start --quiet --pidfile $PIDFILE --exec $DAEMON -- $DAEMON_OPT
    par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    start-stop-daemon --make-pidfile --start --verbose --pidfile $PIDFILE --exec $DAEMON -- $DAEMON_OPT >> /var/run/$NAME.log 2>&1
    Puis regarder ce qu'il y a dans le fichier /var/run/horloge.jar.log
    ɹǝsn *sıɹɐlos*

  9. #9
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 122
    Points : 82
    Points
    82
    Par défaut
    Bsr,
    J'ai pu avoir quelques informations :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    hubert@ubuntu:~$ cat /run/horloge.jar.log 
    java.net.UnknownHostException: ntp.unicaen.fr: Temporary failure in name resolution
            at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
            at java.net.InetAddress$1.lookupAllHostAddr(InetAddress.java:901)
            at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1293)
            at java.net.InetAddress.getAllByName0(InetAddress.java:1246)
            at java.net.InetAddress.getAllByName(InetAddress.java:1162)
            at java.net.InetAddress.getAllByName(InetAddress.java:1098)
            at java.net.InetAddress.getByName(InetAddress.java:1048)
            at horloge.Horloge.main(Horloge.java:60)
    Vu que le script fonctionne en ligne de commande, le UnknownHostException ma incité à penser que tous les services réseau n'étaient pas opérationnels lors de l'éxécution du script au démarrage de la machine. D'ou ma tentative d'introduire un délai :sans succès.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                String time_SERVER = "ntp.unicaen.fr";
                NTPUDPClient timeClient = new NTPUDPClient();
                Thread.sleep(10000);
                inetAddress = InetAddress.getByName(time_SERVER);

    Edit :
    idem sur un autre serveur ntp
    Edit2 : idem en changeant de DNS

  10. #10
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 882
    Points
    7 882
    Par défaut
    Plutôt que de mettre un délai, ce qui est du bricolage, le mieux serait de démarrer le script au bon moment, quand la résolution DNS est opérationelle.

    En y regardant de plus près, tes liens dans les rc*.d sont incorrects, un K20 doit correspondre à un S80, pas un S20.
    ɹǝsn *sıɹɐlos*

  11. #11
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 122
    Points : 82
    Points
    82
    Par défaut
    Bjr,
    Citation Envoyé par jlliagre
    Plutôt que de mettre un délai, ce qui est du bricolage...
    Tout à fait d'accord, mais c'est plutôt des "essais/erreurs" pour déterminer l'origine du problème.
    Citation Envoyé par jlliagre
    En y regardant de plus près, tes liens dans les rc*.d sont incorrects
    Exact; je ne suis pas habitué de ces init.d; ma distribution habituelle (Slackware) ne les gère pas comme celà. J'ai alors fait confiance (à tort) pour les liens symboliques, à la commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    root@ubuntu:/home/hubert# update-rc.d horloge defaults
    Alors qu'il faut utiliser la commande qui précise les paramètres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    root@ubuntu:/home/hubert# update-rc.d horloge start 91 2 3 4 5 . stop 9 0 1 6 .
    Dans le bloc info du script, j'ai mis le même que pour Tomcat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ### BEGIN INIT INFO
    # Provides:          horloge
    # Required-Start:    $remote_fs $syslog $network
    # Required-Stop:     $remote_fs $syslog $network
    # Should-Start:      $named
    # Should-Stop:       $named
    # Default-Start:     2 3 4 5
    # Default-Stop:      0 1 6
    # Short-Description: Example initscript
    # Description:       This file should be used to construct scripts to be
    #                    placed in /etc/init.d.
    ### END INIT INFO
    Après création des liens j'ai :
    • mon script horloge : S91/K09
    • pour Tomcat : S92/K08

    Dans la partie java, j'ai supprimé la résolution de nom et fait l'affectation d'IP en dur ; à l''exécution j'ai maintenant l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    java.io.IOException: Network is unreachable
            at java.net.PlainDatagramSocketImpl.send(Native Method)
            at java.net.DatagramSocket.send(DatagramSocket.java:676)
            at org.apache.commons.net.ntp.NTPUDPClient.getTime(NTPUDPClient.java:90)
            at org.apache.commons.net.ntp.NTPUDPClient.getTime(NTPUDPClient.java:113)
            at horloge.Horloge.main(Horloge.java:66)
    Donc il y a bien un problème d'accès réseau par l'application.

    J'ai réussi à faire fonctionner mon code java de mise à l'heure du système (mais ce n'est qu'un pis-aller) en l'intégrant à la méthode init() d'une servlet, et avec dans web.xml:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        <load-on-startup>1</load-on-startup>

  12. #12
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 882
    Points
    7 882
    Par défaut
    Tu peux essayer 99 au lieu de 90.
    ɹǝsn *sıɹɐlos*

  13. #13
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 122
    Points : 82
    Points
    82
    Par défaut
    Bsr,
    Citation Envoyé par jlliagre
    Tu peux essayer 99 au lieu de 90.
    Même chose : pas d'accès réseau.

    Je pense qu'il s'agit de l'environnement dans lequel est lancé le script.
    Comme je l'indique dans un post précédent, j'ai intégré mon code java dans la méthode init() de mon appli web qui s'exécute dans Tomcat, et je constate :
    • démarrage de Tomcat en ligne de commande

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    root@ubuntu:/home/hubert# service tomcat7 stop
     * Stopping Tomcat servlet engine tomcat7                                                                                                [ OK ] 
    root@ubuntu:/home/hubert# service tomcat7 start
     * Starting Tomcat servlet engine tomcat7                                                                                                [ OK ]
    mon code java accède au réseau;

    • démarrage automatique de Tomcat au reboot (script /etc/init.d/tomcat7)

    le code java n'accède pas au réseau.

    Donc quand mon code fonctionne, j'ai ouvert un shell, et je dois avoir des variables d'environnement qui ne sont pas présentes lors du lancement de script suite à un reboot de la machine.

Discussions similaires

  1. exécuter un script Perl au démarrage de WampServer
    Par tdloic dans le forum Programmation et administration système
    Réponses: 0
    Dernier message: 03/06/2014, 17h59
  2. Exécuter un script à la fin du démarrage ?
    Par kedare dans le forum Administration système
    Réponses: 6
    Dernier message: 18/04/2008, 12h40
  3. [FLASH MX2004] Exécution de script PHP
    Par dleu dans le forum Flash
    Réponses: 2
    Dernier message: 30/03/2005, 19h10
  4. Réponses: 1
    Dernier message: 23/02/2005, 11h23
  5. Exécuter un script SQL
    Par borgfabr dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 05/03/2004, 08h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo