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

Linux Discussion :

que fait le symbole "&" à la fin d'une commande exactement ?


Sujet :

Linux

  1. #1
    Membre habitué

    Inscrit en
    Février 2004
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 342
    Points : 197
    Points
    197
    Par défaut que fait le symbole "&" à la fin d'une commande exactement ?
    bonjour,

    (sous ubuntu 8.04)

    j'ai tjs entendu dire qu'un "&" placé à la fin d'une commande shell avait pour effet de

    lancer la commande exactement comme sans le & à la fin
    SAUF QUE
    le shell rend immediatement la main plutot que d'afficher ce que crache le programme et attendre bien gentiment que le-dit programme se termine.

    pourtant, j'observe un comportement différent.
    dans mon cas, mon petit script php :
    php test.php -n 10 >> logfile.log
    marche bien

    mais
    php test.php -n 10 >> logfile.log &
    ne marche pas du tout
    qd on tail -f logfile.log on voit bien qu'il ne se passe rien, d'ailleurs la commande avec le & ne semble jms se terminer (je dois la killer)

    qqn a une idée ?

  2. #2
    Membre chevronné Avatar de jeanbi
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 703
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 703
    Points : 2 247
    Points
    2 247
    Par défaut
    bonjour,
    une commande system exemple : firefox &
    mais je ne pense pas que php gere la meme chose !!
    au fait pas besoin de killer crtl +c dans la console arrete le programme encours .
    a+

  3. #3
    Membre habitué

    Inscrit en
    Février 2004
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 342
    Points : 197
    Points
    197
    Par défaut
    donc ce serait lié à php spécifiquement ?

  4. #4
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Le & sert effectivement à lancer une commande en arrière plan. Ca veut dire que le shell lance la commande et n'attend pas qu'elle se termine.

    Le & est interprété par le shell. La commande (php dans ce cas) ne vois pas le "&" dans ses arguments. Le & fait donc toujours la même choses, quelle que soit la commande à laquelle il est appliqué : il lance la commande en arrière-plan.

    Il y a surement une autre explication à le différence de comportement que tu observes. Difficile d'en dire plus sans savoir ce que fait ton script.

  5. #5
    Membre chevronné
    Avatar de lilington
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 681
    Points : 1 800
    Points
    1 800
    Par défaut
    en faite quand tu lances une commande dans un terminal elle depend essentiellement de l'utilisateur connecte, dans dans le cas d'un terminal que tu aura ouvert, des que tu agit sur ce teminal (fermeture, CTRL+C) tu perts automatiquement tout les programmes ouverts meme avec &.
    bref & te permet de lancer une autre commande et garder la main sur le terminal. si tu veux que l'application que tu lances soit independante du terminal ouvert tu peux par example faire ca:
    donc quand tu ferme le terminal firefox restera ouvert. tu peux aussi combiner nohup et &.
    attention lorsque ton programme a besoin d'entree clavier ou/et sortie sur terminal ilfaut rediriger le tout vers null ou vers un fichier. bref man nohup
    Petit lien vers mon premier jeux SDL2/C
    http://store.steampowered.com/app/72..._Soul_Of_Mask/
    la suite? ca vient,ca vient!

  6. #6
    Membre habitué

    Inscrit en
    Février 2004
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 342
    Points : 197
    Points
    197
    Par défaut
    le script en question se contente de se connecter à un server récupérer qqs données, cracher deux-trois élément à la console pour dire où il est en et puis se termine.

    en gros pour moi l'idée est ensuite de l'appeler périodiquement via un crontab.

    donc en tout cas vous me confirmer qu'a priori le fait de mettre le & à la fin de la commande n'a aucune incidence sur le programme (php) qui du reste ne devrait mm pas etre capable de savoir qu'il a été appelé avec le & à la fin

    j'ai bon ?

  7. #7
    Membre chevronné
    Avatar de lilington
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 681
    Points : 1 800
    Points
    1 800
    Par défaut
    effectivement avec cron tu regles vites le probleme mais sinon j'ai un script php justement de monitoring d'un pc que j'ai lance avec nohup monscript.php &
    apres je me deconnect, je ferme le terminal et j'ai bien le script qui tourne facile a verifier avec un ps |grep monscript
    Petit lien vers mon premier jeux SDL2/C
    http://store.steampowered.com/app/72..._Soul_Of_Mask/
    la suite? ca vient,ca vient!

  8. #8
    Membre habitué

    Inscrit en
    Février 2004
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 342
    Points : 197
    Points
    197
    Par défaut
    mmm.. je comprends pas ce qui se passe

    scriptA.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <?php 
     
    sleep(5); // dodo 5 sec
     
    ?>
    donc scriptA.php est juste un programme qui ne va pas retourner avant 5 sec. (c'est juste pour simuler un script un peu long disons)

    scriptB.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <?php
    for($i=0 ; $i < 3; $i++) {
        echo "$i : lancement du scriptA...";
        exec('php scriptA.php &');
        echo "terminé\n";
    }
    ?>
    et donc alors qu'on pourrait s'attendre à l'output suivant quasi instantané:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $ php script2.php
    0 : lancement du scriptA...terminé
    1 : lancement du scriptA...terminé
    2 : lancement du scriptA...terminé
    $
    puis constater au ps aux | grep php qu'il y a bien 3 lignes php scriptA.php qui sont tjs en train de s'executer

    à la place j'ai la sortie suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $ php script2.php
    0 : lancement du scriptA...
    qui continue toutes les 5 secondes

    c'est essayé avec et sans le &
    j'observe le mm comportement

    qu'est-ce qui se passe ? c'est qqch de spécifique à mon setup ? à php ?

  9. #9
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Lire la doc : http://fr3.php.net/manual/en/function.exec.php
    Note: If a program is started with this function, in order for it to continue running in the background, the output of the program must be redirected to a file or another output stream. Failing to do so will cause PHP to hang until the execution of the program ends.

  10. #10
    Membre habitué

    Inscrit en
    Février 2004
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 342
    Points : 197
    Points
    197
    Par défaut
    Citation Envoyé par matafan Voir le message
    bien vu !

    et pourtant je l'avais cherché celle-là

    bon sinon, c'est crade mais c'est vite fait et ca marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pclose(popen(pclose(popen('php script.php &', 'r'));
    bien sur evidemment, l'eventuel output du programme est perdu

    c'est dommage, j'aurais bien aimé en 2 lignes faire en sorte que le programme ainsi lancé envoie son output dans le mm output que le script qui l'a lancé...

  11. #11
    Membre actif
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Février 2008
    Messages
    174
    Détails du profil
    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Février 2008
    Messages : 174
    Points : 220
    Points
    220
    Par défaut
    Bonjour,

    Pour conserver la sortie du programme, pourquoi ne pas lancer ton script php dans un script shell?
    Tu écrit un petit script qui :
    - gère les cas ou ton script php ne doit pas être appelé,
    - Appel ensuite le script php en redirigeant la sortie vers un fichier de log
    - T'envoi un mail (avec sendmail ou mutt) si il y a un souci (en vérifiant la sortie de ton script php).

    Ensuite, avec une crontab, tu lance ton script shell périodiquement et tout va bien dans le meilleur des monde non?
    Vous n'arrivez pas à faire ce que vous voulez avec Linux?
    Read The Fine Manual !==>The Linux Documentation Project

Discussions similaires

  1. Réponses: 3
    Dernier message: 30/09/2009, 10h00

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