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 :

rc.local script pas interprété Debian 9 Stretch


Sujet :

Shell et commandes GNU

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 394
    Par défaut rc.local script pas interprété Debian 9 Stretch
    Bonjour,
    Je lance sun script dans un environnement pxe debian Stretch.

    Le script ex.sh est dans le rc.local. Le script est bien lancé au démarrage mais il possède des interactions avec l'utilisateur fonction "read" qui ne sont pas pris en compte ! . Je me retrouve avec le login.

    J'ai le message suivant :
    journalctl donne l'information suivante : "opérateur unaire attendu"

    En Debian 6 and 7 c'est ok pas en 9 !

    Une idée ?

    Bien sur quand le lance le script après le login tout est ok !!

    MErci

  2. #2
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    Par défaut
    Bonjour

    Une idée ?
    Sur la différence de comportement en fonction de la version Debian, non.

    Mais sur l'opérateur unaire, tu as, très certainement, dans le test d'une condition, une variable vide que tu crois pleine.
    Et le script plante.

    Tu devrais chercher pourquoi la variable est vide à ce moment là.

  3. #3
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 347
    Par défaut
    Bonjour,

    une variable vide n'empêche pas les opération unaire ou n-aire, mais un vide tout court, oui, provoque des erreurs sur les opération unaire ou n-aire.

    Référence à une possible variable vide:
    Référence à un possible vide:

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 394
    Par défaut
    Merci pour vos réponses mais je pense sans en être sûr que le problème est ailleurs !

    Voilà ce que j'ai fait :
    J'ai pensé que le rc.local etait depricated et j'ai installé mon script via systemd ... Mais le problème est identique.
    Je suis revenu à /etc/rc.local. Dans ma Debian 9 il n'y a pas de /etc/init.d/rc.local ! et le script normalement lancé par celui-ci se lance quand même mais bon là n'est pas le problème enfin je pense !

    Ma configuration :
    Linux Stretch (9) monté via PXE en RO (bug nfs recensé) , et j'ai mis un fstab pour avoir des montages en RW comme /tmp /var /proc ...
    Le système démarre passe dans le /etc/rc.local qui lance par su - root -c "ex.sh" et me donne le login et devrait me demander les informations attendues par le script ex.rh en fait les read ne sont pas pris en compte ...
    Si je lance ce script après le login dans le système linux monté le script me demande les informations vi les read ... et c'est ok

    Pourquoi le système ne prend pas en compte les read dans le ex.sh avant le login ?

    La seule différence que je vois entre la 9 et la 6 et 7 c'est le fstab !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    En 9 :
    tmpfs.proc  /proc           proc  defaults 0 0
    tmpfs.var   /var            tmpfs defaults 0 0
    tmpfs.run   /var/run        tmpfs defaults 0 0
    tmpfs.log   /var/log        tmpfs defaults 0 0
    tmpfs.tmp   /var/tmp        tmpfs defaults 0 0
    tmpfs.media /media          tmpfs defaults 0 0
    tmpfs.log   /var/log        tmpfs defaults 0 0
    tmpfs.mnt   /mnt            tmpfs defaults 0 0
    #tmpfs.root  /root           tmpfs defaults 0 0
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    en 6 : 
    /dev/ram1       /var/run        ramfs   defaults,rw,auto,dev            0 0
    /dev/ram2       /var/lock       ramfs   defaults,rw,auto,dev            0 0
    /dev/ram3       /var/log        ramfs   defaults,rw,auto,dev            0 0
    /dev/ram4       /var/tmp        ramfs   defaults,rw,auto,dev            0 0
    /dev/ram5       /mnt            ramfs   defaults,rw,auto,dev            0 0
    /dev/ram6       /home           ramfs   defaults,rw,auto,dev            0 0
    code du script ex.sh
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    echo ""
      echo "Tapez oui pour confirmer"
      read sur <------------------ il ne s'arrête pas !!!!!!!!!!!!!!
     
      if [ $sur = oui ];  -< Ligne 106
      then
    Erreur :
    ex.sh :
    ligne 106 : [: = : opérateur unaire attendu

    Je ne peux pas mettre la config du 6 en 9 ça ne marche pas pour les file system montés !!

    A+ J'espère

  5. #5
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    Par défaut
    • Pour l'erreur proprement dite, disedorgue t'a répondu.
      Il faut protéger ta variable, sinon, tu as juste un vide. Et un bug.
    • Il y a démarrage et démarrage.
      Tu interviens trop tôt.
      Il y a
      • le démarrage du système
      • le démarrage des services
      • le démarrage de la session
      • le démarrage de la session graphique
      • le démarrage de la console
      • etc

    • À qui parles-tu ?
      Tu te rends compte que, symboliquement, tu poses une question à un utilisateur qui n'existe pas, puisqu'il n'est pas logué.
      rc.local n'est pas adéquat pour faire des entrées/sorties à ce moment-là du démarrage.
      Sur internet, on trouve des solutions diverses de redirections, ou d'arrêt d'autre module comme plymouth quit, pour rendre au script ses canaux standards.

      Mais la simple solution n'est-elle pas de mettre ton script dans /etc/profile.d, qui s'exécute à la connexion d'un utilisateur ? (il existe et te répond)

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 394
    Par défaut
    Merci pour cette réponse.

    Mais dans le rc.local comme expliqué ci-dessus il y a un su - root -c 'ex.sh" . Je voudrais reproduire ce qui existe en debian 6.

    En protégeant les variables, c'est pas le problème. C'est la fonction read qui n'est pas exécuté en mode entrée sortie ?

    Comment activer ou faire fonctionner le read (du bash) dans un rc.local ou (systemd) avant le login ? Je ne trouve pas la solution à moins de revenir à un debian 6 !

    Je sais ce n'est pas très propre, mais dans un fonctionnement PXE il faut aller au plus simple : on démarre le poste puis on répond à deux questions (read !) et le script se lance pour les utilisateurs ...

    Merci je cale.

  7. #7
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 347
    Par défaut
    Et comment est configuré ton démarrage de rc.local ?
    Peut-être dans:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /etc/systemd/system/rc-local.service
    ou avec une profondeur supplémentaire.
    Enfin, le but est d'avoir sa configuration pour les paramètres:
    StandardOutput
    StandardInput
    StandardError

    Et de les configurer correctement...

    Tu peux voir le man systemd.exec.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 394
    Par défaut
    Merci à vous deux.

    MAis je n'ai pas de solution :

    Avec systemd : le script au démarrage fait la même erreur (passe le read)
    avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    [Unit]
    Description=Recup donnees avec systemd
     
    [Service]
    type=idle
    ExecStart=/etc/rc.local
    StandardInput=tty j'ai essayé tty-force aussi
    StandardOutput=tty
    TTYPath=/dev/tty1
     
    [Install]
    WantedBy=multi-user.target
    enable ... puis redémarage du pxe de nouveau passe le script et me propose le login. J'ai essayé avec un autre script autre que rc.local comme mon_script dans ExecStart idem !

    Quand je lance systemctl restart monScript.service me donne le curseur pour saisir mais reste bloqué !

    En fait la question est la suivante :
    Comment faire pour lancer un script en root avec des montages nfs avec E/S (!fonction read) avant le login !!!!!!!!

    Je suis revenu en arrière avec le fameux init.d !
    Avec mon /etc/rc.local (qu contient su - root -c "monscript") je lance /etc/init.d/rc.local même erreur me donne pas la main : si j'execute /etc/rc.local c'est ok !!!!!!!!
    Que fait init.d en plus !! Pourquoi ça marchait en Debian 6 et ça marche encore !
    Merci

  9. #9
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 347
    Par défaut
    Peux-tu essayer avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [Unit]
    Description=Recup donnees avec systemd
    After=getty@tty1.service
     
    [Service]
    type=oneshot
    ExecStart=/etc/rc.local
    StandardInput=tty
    StandardOutput=tty
    TTYPath=/dev/tty1
     
    [Install]
    WantedBy=multi-user.target

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 394
    Par défaut
    Merci pour votre message mais c'est pareil !


    Nom de la machine : pas d'arrêt ici
    juin 28 15:09:53 localhost rc.local[289]: ###################
    juin 28 15:09:53 localhost rc.local[289]: Profil turni
    juin 28 15:09:53 localhost rc.local[289]: ###################

    En faisant
    systemctl show rc.local.service
    une partie une idée ? j'ai bien
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    Type=simple
    Restart=no
    NotifyAccess=none
    RestartUSec=100ms
    TimeoutStartUSec=1min 30s
    TimeoutStopUSec=1min 30s
    RuntimeMaxUSec=infinity
    WatchdogUSec=0
    WatchdogTimestampMonotonic=0
    FailureAction=none
    PermissionsStartOnly=no
    RootDirectoryStartOnly=no
    RemainAfterExit=no
    GuessMainPID=yes
    MainPID=0
    ControlPID=0
    FileDescriptorStoreMax=0
    NFileDescriptorStore=0
    StatusErrno=0
    Result=success
    UID=4294967295
    GID=4294967295
    ExecMainStartTimestamp=Thu 2018-06-28 15:09:54 CEST
    ExecMainStartTimestampMonotonic=11158348
    ExecMainExitTimestamp=Thu 2018-06-28 15:09:54 CEST
    ExecMainExitTimestampMonotonic=11227068
    ExecMainPID=337
    ExecMainCode=2
    ExecMainStatus=1
    ExecStart={ path=/etc/rc.local ; argv[]=/etc/rc.local ; ignore_errors=no ; start
    Slice=system.slice
    DevicePolicy=auto
    TasksAccounting=yes
    TasksMax=4915
    UMask=0022
    OOMScoreAdjust=0
    Nice=0
    NonBlocking=no
    StandardInput=tty
    StandardOutput=tty
    StandardError=inherit
    TTYPath=/dev/tty1
    TTYReset=no
    TTYVHangup=no
    TTYVTDisallocate=no
    Id=rc.local.service
    Names=rc.local.service
    Requires=sysinit.target system.slice
    WantedBy=multi-user.target
    Conflicts=shutdown.target
    Before=shutdown.target multi-user.target
    After=sysinit.target basic.target system.slice getty@tty1.service
    Description=Recup donnees avec systemd
    LoadState=loaded
    ActiveState=inactive
    SubState=dead
    FragmentPath=/etc/systemd/system/rc.local.service
    UnitFileState=enabled
    UnitFilePreset=enabled
    CanStart=yesCanStop=yes
    CanReload=no
    CanIsolate=no
    NeedDaemonReload=no
    JobTimeoutUSec=infinity
    JobTimeoutAction=none
    ConditionResult=yes
    AssertResult=yes

    Je peux toujours comme le disait Flodelarab rajouter le script dans /etc/profile.d mais là il faut se connecter ! C'est curieux que ça marche en Debian 6. Mais depuis le fonctionnement de init.d est devenu obsolète et systemd prend la relève avec plus de restrictions ?

  11. #11
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    Par défaut
    Pardon, mais, avant, c'était pareil; si tu as un problème de concurrence.

    C'est pour ça que tu pourrais tenter d'utiliser tty2 au cas ou un autre service monopolise tty1.
    Comme dans le lien suivant :
    https://alan-mushi.github.io/2014/10...h-systemd.html

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 394
    Par défaut
    re,
    c'est presque parfait !

    J'ai en effet sur le tty2 les questions de mon script donc c'est super !

    Juste il ne faut pas mettre dans le ExecStart rc.local parce qu'il est executé par systemd par défaut en mode de compatiblité donc lancé deux fois !
    Il faut mettre dans le ExecStart le script directement comme =/bin/bash /bin/as.sh

    Cependant, je n'arrive pas à me positionner sur tty2 ! J'ai essayé de faire un nouveau lien via systemd sur le getty2 et l'activer mais il devient occupé et le script se lance plus.

    SI je garde ma config actuelle avec un tty1 qui attend le login et tty2 avec le script qui fonctionne mais qui n'est pas visible !

    Comme fait (puisque inittab n'existe plus !) d'activer par défaut le tty2 ?
    J'ai mis dans le rc.local :
    je bascule bien en tty2 mais j'ai des log de démarrage qui s'affiche pas dessus !
    Merci à vous

  13. #13
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    Par défaut
    Sous Debian 9 (stretch), j'ai actuellement
    • Ctrl+Alt+F1 Connexion graphique
    • Ctrl+Alt+F2 Session graphique normale
    • Ctrl+Alt+F3 Console en attente tty3
    • Ctrl+Alt+F4 Console en attente tty4
    • Ctrl+Alt+F5 Console en attente tty5
    • Ctrl+Alt+F6 Console en attente tty6


    Peut-être est-il judicieux d'utiliser tty3 pour ta console de script de démarrage ? (chvt 3)
    Et laisser le comportement graphique par défaut.

    Ctrl+Alt+Fn est équivalent à chvt n.

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 394
    Par défaut
    idem le tty2 ou ttyy3 sont brouillés par des logs !

    Soit je met un service S99 avac chvt à tester, soit soit il existe une option dans le systemd pour lancer le script de changement de terminal (contient chvt 2) à la fin ?

    A suivre ... Merci

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 394
    Par défaut
    avec dans le rc.local :
    chvt 2

    dans le script.sh (vi /etc/systemd/system/script.service )en ajouter un sleep !! :
    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
     
    [Unit]
    Description=Recup donnees avec systemd
    After=getty@tty2.service
     
    [Service]
    type=oneshot
    ExecStartPre=/bin/sleep 5
    ExecStart=/bin/recup-donnees.sh
    StandardInput=tty
    StandardOutput=tty
    TTYPath=/dev/tty2
     
    [Install]
    WantedBy=multi-user.target
    Résumé :
    -Le script avec E/S se lance avant le login sur le tty2 !!!!!!


    Tout est ok. Un grand merci à vous et à bientôt

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Script qui fonctionne en local, mais pas en ligne
    Par student_php dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 15/11/2010, 10h22
  2. [AJAX] Script marche en local mais pas en ligne
    Par obito dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 25/02/2009, 11h20
  3. script qui marche en locale mais pas sur le web
    Par koKoTis dans le forum Langage
    Réponses: 7
    Dernier message: 08/09/2008, 16h07
  4. Script marche en local mais pas en ligne
    Par Invité dans le forum Langage
    Réponses: 2
    Dernier message: 10/07/2008, 15h51
  5. Réponses: 18
    Dernier message: 12/06/2006, 09h39

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