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 :

[Bash]processus arrière plan


Sujet :

Linux

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 18
    Points : 14
    Points
    14
    Par défaut [Bash]processus arrière plan
    Bonsoir,
    Je voudrais exécuter une commande en arrière plan et redirigé la sortie dans un fichier, puis une fois la commande fini rajouter "FIN" au fichier. Je ne suis pas sur de la syntaxe.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ssh user@server commande -optionA -optionB 2>&1 > /tmp/fichier ; echo "FIN" >> /tmp/fichier &
    Est ce que cette commande me permet de fermer le terminal d'ou elle s'exécute ?

    Merci

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 729
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 729
    Points : 31 052
    Points
    31 052
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par wotan2009 Voir le message
    Bonsoir,
    Je voudrais exécuter une commande en arrière plan et redirigé la sortie dans un fichier, puis une fois la commande fini rajouter "FIN" au fichier. Je ne suis pas sur de la syntaxe.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (commande ; echo FIN) 1>fichier 2>&1 &
    Citation Envoyé par wotan2009 Voir le message
    Est ce que cette commande me permet de fermer le terminal d'ou elle s'exécute ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (commande ; echo FIN) 1>fichier 2>&1 &; exit

  3. #3
    Membre averti Avatar de fransoo
    Inscrit en
    Novembre 2009
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 209
    Points : 300
    Points
    300
    Par défaut
    Le problème est que le job lancé reste un processus fils du terminal duquel il est lancé, et à la fermeture du terminal le processus fils s'arrête. J'ai cherché dans trois directions pour résoudre ce genre de problème :
    1. disown : Qui enlève un processus lancé en arrière-plan de la table des jobs. (l'option -h permet d'éviter un SIGHUP quand on quitte le terminal)
    2. screen -d -m : démarre screen en mode "detached". Pour plus de détails voir le manuel de screen. Son avantage réside dans le fait qu'on peut reprendre la main en entrant screen -r
    3. at : planifie le programme, il est ensuite lancé par le démon atd.
      J'ai utilsé disown en local, pas essayé en ssh. Screen n'a pas toujours eu le comportement attendu. J'utilise at mais c'est parce que le job doit être planifié (la commande at + 1 minutes le lance une minute plus tard, cela peur être exploité)

    Dans tous les cas, il vaut mieux faire des essais avec un script ad-hoc et observer le comportement.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut
    la commande "wait" attend tant que tous les jobs ne sont pas finis
    wait %1 va attendre jusqu'a ce que ton premier job soit fini etc ... (man wait)

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 18
    Points : 14
    Points
    14
    Par défaut
    Bonjour et merci pour vos réponses.
    Pour la syntaxe c'est nickel.
    Pour la fermeture du terminal lors de l'execution du processus, on m'a dit d'utiliser la commande nohup avant de lancer la commande, mais il me semble que si le processus est en arrière plan cela n'a aucun effet. Je ne suis pas trop sur.
    Si la fermeture du terminal n'est pas faisable, est ce qu'il est possible de déconnecter l'utilisateur quui a lancé le processus ?

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 729
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 729
    Points : 31 052
    Points
    31 052
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par wotan2009 Voir le message
    Bonjour et merci pour vos réponses.
    Pour la syntaxe c'est nickel.
    Pour la fermeture du terminal lors de l'execution du processus, on m'a dit d'utiliser la commande nohup avant de lancer la commande, mais il me semble que si le processus est en arrière plan cela n'a aucun effet. Je ne suis pas trop sur.
    Si la fermeture du terminal n'est pas faisable, est ce qu'il est possible de déconnecter l'utilisateur quui a lancé le processus ?
    Hum... je ne suis pas certain de bien comprendre ton besoin. On va détailler le nohup.
    Dans Unix/Linux, les processus sont liés par une arborescence père/fils. Le processus 1 lance le 2 qui va lancer le 3 qui va lancer le 4 etc. Ainsi, on arrive à un moment donné dans un terminal qui est le Xième processus. Et ce terminal va pouvoir lancer des commandes qui seront donc des fils.

    Dans Unix, généralement le père attend son fils pour continuer. Toutefois, il peut arriver que le père s'arrête brutalement (par une action extérieure ou autre). Dans ce cas, l'ordonnanceur qui gère les tâches arrête alors tous les fils du processus terminé. Et si un des fils qui s'arrête a encore des fils actifs, le même schéma se reproduit.

    Si un procesuss est lancé en nohup, alors il sera protégé contre cette action. Et si par hasard le père vient à disparaître, alors le processus protégé devenu orphelin sera adopté par le processus 1 (init)

    Donc si tu veux lancer un script et déconnecter l'utilisateur, si l'utilisateur travaille dans un environnement de type "simple terminal", il te suffit de taper
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    nohup commande &
    exit
    L'utilisateur sera déconnecté de son environnement terminal (puisque la commande "exit" lui aura fait quitter son shell) mais sa commande se continuera jusqu'à la fin.

    Maintenant si l'utilisateur travaille dans un environnement graphique style gnome/kde, il faudra demander spécifiquement la déconnection de l'environnement. Mais je pense que si tu en arrives là, c'est que quelque part tu as raté un truc dans l'analyse de ton besoin...

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 18
    Points : 14
    Points
    14
    Par défaut
    Bonjour, je te remercie de cette explication.
    Pour récapituler, il est préférable d'executer cette commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nohup (commande ; echo FIN) 1>fichier 2>&1 & ; exit
    plutôt que,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (commande ; echo FIN) 1>fichier 2>&1 & ; exit
    Mon but étant de pouvoir lancer une commande en arrière plan, rediriger la sortie dans un fichier, pouvoir fermer le shell du user avec lequel j'ai lancé le processus sans tuer ce processus.
    Je travaille dans un environnement terminal.
    Une fois le shell du user fermé, je peux aussi fermer le terminal ?

    Merci

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 729
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 729
    Points : 31 052
    Points
    31 052
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par wotan2009 Voir le message
    Bonjour, je te remercie de cette explication.
    Pour récapituler, il est préférable d'executer cette commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nohup (commande ; echo FIN) 1>fichier 2>&1 & ; exit
    plutôt que,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (commande ; echo FIN) 1>fichier 2>&1 & ; exit
    Je ne sais pas si le nohup acceptera la syntaxe (commande1; commande 2) mais l'idée est bonne.
    Si jamais le nohup ne l'accepte pas, alors tu crées un script "toto.sh" qui contient ceci
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #!/bin/bash
    commande
    echo FIN
    Puis tu lances toto.sh en nohup de cette façon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    nohup toto.sh 1>fichier 2>&1 &
    exit
    Citation Envoyé par wotan2009 Voir le message
    Mon but étant de pouvoir lancer une commande en arrière plan, rediriger la sortie dans un fichier, pouvoir fermer le shell du user avec lequel j'ai lancé le processus sans tuer ce processus.
    Je travaille dans un environnement terminal.
    Une fois le shell du user fermé, je peux aussi fermer le terminal ?
    Oui c'est ça. Dès que le père du programme se termine, le programme est alors adopté par init. A ce moment là, plus rien ne peut l'atteindre sauf action directe via kill. Tu peux donc fermer tout le reste sans soucis.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 08/09/2011, 14h49
  2. Changer la priorité des processus d'arrière plan Oracle
    Par dcollart dans le forum Administration
    Réponses: 1
    Dernier message: 16/07/2010, 15h22
  3. Lancer sous la console dos un processus en arrière plan.
    Par ziad.shady dans le forum Scripts/Batch
    Réponses: 6
    Dernier message: 25/10/2009, 14h44
  4. exécution processus arrière plan
    Par lesafir dans le forum VB.NET
    Réponses: 3
    Dernier message: 09/12/2008, 12h14
  5. Lancer des processus en arrière plan
    Par momeftah dans le forum Shell et commandes GNU
    Réponses: 11
    Dernier message: 01/05/2007, 18h50

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