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 :

[Shell] Rechercher si un fichier est en cours d'exécution dans un script


Sujet :

Shell et commandes GNU

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2014
    Messages : 8
    Points : 12
    Points
    12
    Par défaut [Shell] Rechercher si un fichier est en cours d'exécution dans un script
    Bonjour,

    Je bloque sur une condition où l'on doit vérifier si le script est lancé ou pas.
    En faisant ./verif.sh, soit le fichier se lance, soit il ne se lance pas car il est déjà en cours d'exécution.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if [ `ps -ef | grep verif.sh | wc -l ];
    then
    echo "Un test est en cours"
    exit 0
    else
    le fichier s'exécute
    Mon problème est donc de rechercher uniquement le fichier car en faisant ps -ef grep, j'ai évidemment aussi le résultat de la commande grep.
    Cela me retourne toujours "Un test est en cours".

    J'ai essayé aussi avec ps -A , cette fois-ci le script se lance bien mais en le lançant une deuxième fois il s'exécute aussi au lieu de dire qu'il est déjà lancé.

    Merci de votre aide

  2. #2
    Expert éminent sénior Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Points : 12 264
    Points
    12 264
    Par défaut
    pour faire ça une methode plus fiable est de faire sur le même principe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    # num=$(ps -aux| grep -i firefox | grep -v grep | awk '{print $2}')
    # echo $num
    16783
    #
    la commande est abérante mais c'est juste pour qu'elle soit compréhensible tu l'optimisera avec un seul sed ou un seul awk apres le ps ....


    ça te charge la variable avec un numéro de processus

    tant que ce dernier existe dans /proc/$num/ ton fichier est en cours d'execution, et tu y faire pleins d'analyses complémentaires... bien plus fines....

  3. #3
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par frepixunli Voir le message
    Mon problème est donc de rechercher uniquement le fichier car en faisant ps -ef grep, j'ai évidemment aussi le résultat de la commande grep.
    En général, il y a 3 solutions possibles:
    - utiliser pgrep (voir le man),
    - utiliser grep | fgrep -v grep,
    - utiliser egrep 'verif[.]sh'.

    De plus, il vaut mieux utiliser l'option -q du dernier grep plutôt que piper avec un wc.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2014
    Messages : 8
    Points : 12
    Points
    12
    Par défaut
    Merci pour vos réponses.

    Je vais essayer d'appliquer vos méthodes

  5. #5
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 387
    Points
    19 387
    Par défaut
    Bonjour,

    sur un air connu des habitués : ON N'UTILISE PAS ps DANS UN SCRIPT !
    alors qu'il y a des outils spécialisés :éventuellement,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    exe=$(ps h -C verif.sh)
    test -n "$exe" && echo "en cours" || echo "arrêté"
    en gros.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    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 280
    Points : 12 729
    Points
    12 729
    Par défaut
    Bonjour,
    Une méthode avec le ps et le grep sans qu'il remonte la commande grep:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ps -ef | grep [v]erif.sh
    Cordialement.

  7. #7
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    Idéalement, ton script devrait écrire, à chaque lancement, son numéro de pid dans le fichier /var/run/monscript/monscript.pid

    En fin de script, le fichier de pid est supprimé. Au lancement, on vérifie que le fichier pid n'existe pas. S'il existe, on quitte avec un message d'erreur. Le script doit savoir catcher les signaux envoyé par kill pour supprimer le fichier pid quand il est tué, afin de ne pas avoir à le supprimer à la main. Ainsi on n'a jamais besoin de lancer ps et c'est standard.
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  8. #8
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Une méthode avec le ps et le grep sans qu'il remonte la commande grep:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ps -ef | grep [v]erif.sh
    Si, par malheur (ou comme un fait exprès), il existe un processus dont le nom est (ou contient), par exemple, verifish, j'ai bien peur que ta commande ne le détecte abusivement!

    En conséquence, je préfère la solution que j'ai déjà proposée un peu plus haut:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ps -ef | egrep verif[.]sh
    Elle n'est pas parfaite, loin de là... Elle est juste un tout petit petit petit peu moins "beuguée"!

    Pour bien faire, il faudrait peaufiner encore la regexp, mais on n'arriverait de toute façon pas à exclure des commandes comme emacs verif.sh (ou vi verif.sh, si on préfère...), ou d'autres du même acabit.

    La solution la plus blindée est définitivement celle proposée par ggnore ! (que je plussoie abondamment!)

  9. #9
    Expert éminent sénior Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Points : 12 264
    Points
    12 264
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Bonjour,
    Une méthode avec le ps et le grep sans qu'il remonte la commande grep:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ps -ef | grep [v]erif.sh
    attention avec cette methode ça ne marche pas tjrs.

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2014
    Messages : 8
    Points : 12
    Points
    12
    Par défaut
    Bonjour à tous,

    Merci pour votre aide et vos tuyaux. Après plusieurs tests, j'ai retenu la solution de frp31
    J'ai voulu testé la méthode ggnore avec /var/run/monscript/monscript.pid mais je n'ai pas trouvé le nom de mon fichier quand je le lançais.

    Mon script fonctionne très bien. Le script retourne bien ce que je souhaite.
    Je mets mon exemple si ça peut servir à d'autres

    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
     
    num=$(ps -ef| grep -i verif.sh | grep -v grep | awk '{print $2}' | head -n 1)
     
            if [ "$num" == "" ];
            then
            echo 0
            chemin/verif.sh
            else
                    proc=`ls /proc/ | grep "$num"`
                    echo "num : $num"
                    echo "proc : $proc"
     
                    if [ "$num" == "$proc" ];
                    then
                    echo "Un test est en cours"
                    exit 0
                    fi
            fi

  11. #11
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 387
    Points
    19 387
    Par défaut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    num=$(ps -ef| grep -i verif.sh | grep -v grep | awk '{print $2}' | head -n 1)
    j'avais pas vu, j'aurais dû moinsser : c'est horrible !
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  12. #12
    Expert éminent sénior Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Points : 12 264
    Points
    12 264
    Par défaut
    proc=`ls /proc/ | grep "$num"`

    c'est mieux comme ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [ -d /proc/$num ] && action_existe || action_existepas
    num=$(ps -ef| grep -i verif.sh | grep -v grep | awk '{print $2}' | head -n 1)
    c'est horrible aussi ça


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ num=$(ps -aux | pgrep firefox) # ça suffit !
    $ echo $num
    20007
    $ unset num  #purger la variable

  13. #13
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    Citation Envoyé par frepixunli Voir le message
    J'ai voulu testé la méthode ggnore avec /var/run/monscript/monscript.pid mais je n'ai pas trouvé le nom de mon fichier quand je le lançais.
    Le principe c'est de créer ce fichier à l'aide de ton script. Si tu ne l'écris pas, il n’apparaîtra pas spontanément.
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  14. #14
    Expert éminent sénior Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Points : 12 264
    Points
    12 264
    Par défaut
    Citation Envoyé par ggnore Voir le message
    Le principe c'est de créer ce fichier à l'aide de ton script. Si tu ne l'écris pas, il n’apparaîtra pas spontanément.
    par exemple

    touch /var/run/$0.$$.pid
    par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    # cat > t.sh
    touch /var/run/$0.$$.pid
    ls -lrth /var/run/*.pid | tail -1
    rm /var/run/$0.$$.pid
    exit 0
    # 
    # sh t.sh
    -rw-r--r--  1 root  wheel     0B Aug 27 17:21 /var/run/t.sh.1812.pid
    #
    pourquoi metre le n° du process dans le nom de fichier ?
    parce que si ton script merdouille et qu'il y a deux sessions lancées tu peux ainsi savoir lequel tuer/purger...et lequel laisser se finir....

  15. #15
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    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 280
    Points : 12 729
    Points
    12 729
    Par défaut
    C'est vrai que je n'ai fait que répondre à la question à propos de l'apparition de la ligne grep

    Donc voici une méthode sous LINUX qui rejoint le propos de ggnore:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/usr/bin/bash
     
    exec 200>~/.verifsh.xlock
    if !(flock -x -n 200) 
    then
      echo "process deja en cours"
      exit 1
    fi
    echo "On commence le process"
    Ici, le script essaie de locker de façon exclusive le fichier ~/.verifsh.xlock, s'il n'y parvient pas, c'est que celui-ci est déjà locker par un process en court et fais donc un exit 1.
    Comme ici, le lock disparaît à la fermeture du fichier, il n'y a pas besoin de trapper les signaux d'interruption de process.
    Cordialement.

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

Discussions similaires

  1. Savoir qu'un fichier est en cours de copie
    Par SheikYerbouti dans le forum Unix
    Réponses: 6
    Dernier message: 23/10/2013, 12h39
  2. [Shell] Tester si un fichier est vide
    Par Spitfire378 dans le forum Linux
    Réponses: 3
    Dernier message: 10/02/2008, 12h18
  3. [SQL] Tester si un fichier est en cours d'utilisation
    Par obordelow dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 26/04/2007, 14h07
  4. Réponses: 14
    Dernier message: 07/07/2006, 16h27
  5. Réponses: 1
    Dernier message: 31/03/2006, 11h24

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