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 :

Bash et libssh2 de PHP


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 16
    Par défaut Bash et libssh2 de PHP
    Bonsoir à tous !

    Je viens vers vous pour tenter de résoudre un problème qui me tracasse la tête et dont les symptomes vous permettront peut être de m'aider à découvrir ce qui ne va pas.
    J'utilise un script php qui via libssh2 fait appel à un script bash qui créé un utilisateur et copie des fichier dans son répertoire. Jusque là rien d'anormal, puisque d'ailleurs cela fonctionne correctement !
    Là où ça plante par contre, c'est lorsque je relance le script qui refait appel au script bash pour créé un second compte alors que le premier script bash (le script php étant terminé) tourne toujours.
    Le problème ne semble pas venir de php, un 'ps -aux' me renvois la liste de commande envoyé au shell dont le useradd du second compte qui est la première instruction mais qui bloque dessus, ça finit par timeout je pense.

    Ma première question est donc de savoir si il est possible d’exécuter sans problème une seconde fois un script bash pendant que le premier appel est encore en execution ?
    Si c'est possible, ma seconde question est donc de savoir si l'un d'entre vous a été confronté à un problème similaire et a su y remédier ? Ou même si cela pourrait finalement venir de php (mais comment puisque le premier appel fonctionne correctement, tout comme les suivant d'ailleurs tant qu'on laisse le script bash finir ses instructions) ?

    Merci d'avance !

  2. #2
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Par défaut
    Bonjour.

    Le plus propre je pense, serait de gérer la concurrence par un système de lock.

    Exemple (pas testé, à adapter/corriger, etc) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    LOCK=fichier.lock # l'idéal ce serait de faire un chemin absolu pour éviter les problèmes lorsque ce script est lancé depuis deux endroits différents
    # je test si le fichier LOCK existe et si son contenu correspond bien à un ps existant
    if [ -f $LOCK ] && ps $(cat $LOCK) > /dev/null
    then
        echo "Instance en cours ..."
        exit 1
    else
        echo $$ > $LOCK #j'enregistre le PID du process dans LOCK
        # ... contenu
        rm $LOCK #quand tout est finit je libère
    fi
    Par contre si tu souhaites absolument dérouler deux instances du même script via deux appels, normalement ça ne devrait pas causer de soucis ... il faudrait nous en dire plus sur son contenu et à la limite débugger, mettre des traces etc etc.

    Cordialement,
    Idriss

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 16
    Par défaut
    Bonjour,

    Merci pour votre solution mais malheureusement elle ne me convient pas, le script doit pouvoir s'éxécuter deux fois (ou plus) simultanément quand il y a besoin.

    Le script est tout simple et fonctionne correctement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/bin/bash
    useradd -m $1 -p $2
    cp fichiers.tgz /home/$1
    cd /home/$1
    chown $1:$1 fichiers.tgz
    tar xvf fichiers.tgz
    rm -rf fichiers.tgz
    cd ..
    chown -R $1:$1 $1
    Coté php je lance via la commande "sudo screen -dmS create$user ./create.sh '$user' '$cryptpass'\n" et tout se passe parfaitement.

    J'ai pu voir via ps-aux que parfois sur 5 appel de suite, seule une execution du script pouvait se faire, tout comme il pouvait y en avoir 4 à d'autre moment, et parfois certains ne fonctionnant qu'a moitié ne créant que le compte via useradd mais zappant la copie de fichier, ou alors l'inverse, zappant la création du compte mais copiant les fichiers (l'archive se retrouvant dans /home/ et portant le nom du compte qui devait être créé, sans savoir comment cela a pu se produire puisque aucune instruction de renommage ou de copie dans /home/ n'est prévue)...C'est vraiment aléatoire, tout dépend à quel moment cela tombe, comme si c'était impossible d'executer certaines commandes (dont la création du nouveau screen) lorsque d'autre sont en cours d'execution dans un autre screen (tar qui prend pas mal de temps ?)
    J'avais auparavant essayé de lancer le script sans screen mais bon le script s'arrête dès que la page est finie et seule la première instruction useradd à le temps de se lancer.

    Est-il possible pour un script bash de timeout au bout d'un moment (lorsque trop de ressources sont utilisé) et comme php de pouvoir augmenter cette limite d'execution ?
    Est il possible également de "limiter" les ressources utilisé par un script ? Un peu comme si on lui demandais d'executer ses commandes moins rapidement sans utiliser toutes les ressources qui sont disponible ?

    Encore merci pour votre aide

  4. #4
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Par défaut
    Re-bonjour.

    Dans ce cas je te conseil de mettre des traces : écrire dans un fichier de log (ayant un nom variable, en fonction de la date et de l'heure de lancement par exemple) au fur et à mesure par exemple pour savoir à quel moment ton instance de script bloque et donc sur quelle commande il bloque.

    Même écrire sur la sortie standard au pire ... ça devrait te donner des indications.

    Idriss

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 16
    Par défaut
    Rebonjour,

    Je vais chercher dans cette direction voir en effet où cela bloque, en espérant que les logs soient parlant.

    Merci beaucoup,

    Jejeleponey

Discussions similaires

  1. Inclure un script bash dans une page php
    Par kazylax dans le forum Linux
    Réponses: 1
    Dernier message: 27/01/2009, 16h59
  2. lancement d'un script bash depuis une page php (dans un terminal)
    Par klampke dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 26/11/2008, 02h41
  3. Creation d'une plateforme d'admin (bash et php)
    Par simoryl dans le forum Applications et environnements graphiques
    Réponses: 2
    Dernier message: 25/01/2007, 09h56
  4. Réponses: 8
    Dernier message: 27/07/2006, 09h40
  5. [PHP-JS] PHP & script BASH
    Par popeyes dans le forum Langage
    Réponses: 1
    Dernier message: 12/04/2006, 19h15

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