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

Administration système Discussion :

Stopper un process après un temps donné


Sujet :

Administration système

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 43
    Points : 28
    Points
    28
    Par défaut Stopper un process après un temps donné
    Bonjour,

    Je lance un script, si ce dernier mets plus de X secondes à s'éxécuter je veux le tuer.
    En faite il faudrait lancer en parallele "sleep X && kill PID_du_script" avec "./script", c'est ça?
    Mais comment lancer des scripts ou des commandes en parallele?

    Vous savez?

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 296
    Points : 1 803
    Points
    1 803
    Par défaut
    effectivement un sleep peut fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #lancement en tache de fond (non bloquant donc en // )
    mon_script &
    sleep X
    kill $(pidof mon_script)
    Marc
    Slackware for ever ......
    BASH - KSH ( http://marcg.developpez.com/ksh/ )

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 43
    Points : 28
    Points
    28
    Par défaut
    Ah ok! Effectivement j'avais pas pensé à lancer en tâche de fond.
    Merci

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 43
    Points : 28
    Points
    28
    Par défaut
    Histoires de familles:

    Si je tue le père d'un script, le script se retrouve abandonné et est adopté par Dieu ("init" je suppose que c'est euhhh je ne sais pas unix ).
    Mais moi si je tue le père je voudrais que le fils et les frères aussi se suicident!
    Comment faire?

    (bien entendu je cherche autre chose que faire des grep sur tout les processus qui aurait pour ppid le pid du père et les killer, enfin... je me demande s'il existe une commande prévue à cet effet)

  5. #5
    Membre chevronné

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 296
    Points : 1 803
    Points
    1 803
    Par défaut
    effectivement ..... il te faut recuperer le pid du process lancer en background :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #lancement en tache de fond (non bloquant donc en // )
    mon_script &
    pid=$!
    sleep X
    kill $pid
    Marc
    Slackware for ever ......
    BASH - KSH ( http://marcg.developpez.com/ksh/ )

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 43
    Points : 28
    Points
    28
    Par défaut
    oui mais le process que j'ai lancé en background va me faire des fils, en tuant le process d'arrière plan ses fils vont être recueilli par "init" et ne seront pas tué. Moi je veux que tout les fils ou petit fils du process lancé en arrière plan soient tués avec le père.

  7. #7
    Membre chevronné

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 296
    Points : 1 803
    Points
    1 803
    Par défaut
    en *nix natif :
    ecrit dans un fichier le pid de chaque process a tuer ..... puis utilise cette liste pour tuer.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #lancement en tache de fond (non bloquant donc en // )
    rm -f /tmp/liste_pid
    mon_script &
    pid=$!
    echo $pid >>/tmp/liste_pid
    sleep X
    while read proc
    do
        kill $proc
    done </tmp/liste_pid
    Marc
    Slackware for ever ......
    BASH - KSH ( http://marcg.developpez.com/ksh/ )

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 43
    Points : 28
    Points
    28
    Par défaut
    mhh j'ai pas tout compris....
    c'est quoi ?
    puis je ne comprend pas ça aussi : ton script me supprime aussi les fils des fils du père, autrement dit toute la descendance du père?

  9. #9
    Membre chevronné

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 296
    Points : 1 803
    Points
    1 803
    Par défaut
    oui il supprime tout A CONDITION que dans chaque sous_script (ceux que tu lance en fils) le fichier liste_pid soit mis a jour avec le nouveau pid
    comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    mon_script &
    pid=$!
    echo $pid >>/tmp/liste_pid
    et que seull le premier script efface et creer ce fichier.
    la variable $proc et initialiser par la sequence de commande :
    ce qui signifie :
    tant qu'il y a qq choses a lire (read) l'affecter à la variable proc
    le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    done </tmp/liste_pid
    permet d'indiquer au read de lire en entrée le fichier nommé liste_pid à la place de l'entré standard.
    je te conseil de lire ma doc sur le shell liens dans ma signature.
    Marc
    Slackware for ever ......
    BASH - KSH ( http://marcg.developpez.com/ksh/ )

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 43
    Points : 28
    Points
    28
    Par défaut
    Ca fait juste 2 mois que j'ai des cours d'Unix alors je n'ai pas encore vu toutes les synthaxes notamment le fait de coller une entrée juste derrière le done, je ne savais pas qu'on pouvait, et je n'ai pas saisi le sens tout de suite désolée! Donc avec le while c'est l'équivalent (en mieux) de ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    liste=`cat /tmp/liste_pid`
    for i in liste; do
        kill $i
    done
    Et je suppose qu'en faisant ça c'est moins bien car si le fichier est trop long la variable ne pourra pas tout prendre!

    Voilà sinon MERCI

  11. #11
    Membre chevronné

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 296
    Points : 1 803
    Points
    1 803
    Par défaut
    tout a fait .... en faite ta manière te fait courire le risque de debordement de longueur de variable mais surtout le risque de ne pas t'en sortir en cas ou 1 ligne du fichier contient un caractère blanc ou une tabulation (vu comme un separateur par le for)
    tu gagnerais a ecrire la ta syntaxe comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for i in $(cat /tmp/liste_pid)
    do
       kill $i
    done
    la structure avec le while ne resout pas tout les problème liés a un caractère blanc ou tab mais permet de te garantir le traitement de toute les lignes sans risque d'en perdre une ..
    sinon si le nombre de process n'est pas grand tu peut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    kill $(cat /tmp/liste_tmp)
    sa fonctionne tres bien aussi en plus simple.
    la syntaxe $(....) correspond a une "subtitution de comande" autrement ditr le shell execute ce qui a entre $( et ) et "transforme" la commande en son resultat.
    Marc
    Slackware for ever ......
    BASH - KSH ( http://marcg.developpez.com/ksh/ )

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 43
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par MarcG
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    kill $(cat /tmp/liste_tmp)
    sa fonctionne tres bien aussi en plus simple.
    la syntaxe $(....) correspond a une "subtitution de comande" autrement ditr le shell execute ce qui a entre $( et ) et "transforme" la commande en son resultat.
    même chose que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    kill `cat /tmp/liste_tmp`
    je ne connaissais pas la substitution de commande $()

  13. #13
    Membre chevronné

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 296
    Points : 1 803
    Points
    1 803
    Par défaut
    c'est bien la même choses mais la syntaxes "posix" est $(..), effectivement unix reste compatible avec lui même donc garde les anciennes syntaxes.
    le problème du ` ....` est qu'il est difficile a diferencier de ' .... ' celon les ecrans/console que tu utilises.
    Marc
    Slackware for ever ......
    BASH - KSH ( http://marcg.developpez.com/ksh/ )

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

Discussions similaires

  1. Stopper un thread après un certain temps
    Par Rodrigue dans le forum C++/CLI
    Réponses: 1
    Dernier message: 14/04/2008, 13h25
  2. Stopper une action apres avoir cliquez sur un bouton
    Par geriler dans le forum Windows Forms
    Réponses: 3
    Dernier message: 03/03/2008, 16h31
  3. Réponses: 1
    Dernier message: 09/01/2008, 14h02
  4. Redirection après x temps donné
    Par chuispasla dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 12/07/2007, 07h44
  5. Forcer de tuer un process après fermeture d'une applic!
    Par _shuriken_ dans le forum Windows XP
    Réponses: 14
    Dernier message: 26/01/2007, 15h27

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