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 :

Projet création d'une commande Linux


Sujet :

Shell et commandes GNU

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Janvier 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Janvier 2017
    Messages : 8
    Points : 8
    Points
    8
    Par défaut Projet création d'une commande Linux
    Bonjour,
    Je suis étudiant en DUT informatique et lors des projets de fin de semestre nous devons faire une commande en linux.
    Je suis vraiment à la ramasse dans cette matière, et donc je cherche de l’aide pour ce projet qui représente une partie important de ma note de semestre.

    Le but du projet est de :
    - créer l’arborescence résultat de la commande ps -edf. Avec le nom des PID, et un fichier texte pour le nom du processus.
    - écrire un script bash pour produire un fichier de la forme de la sortie de ps -edf. L’inverse de la première commande.


    Je suis tout ouïe pour toutes pistes ou aide de votre part …

    Merci beaucoup et bonne journée !

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

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

    Le but du projet est de :
    - créer l’arborescence résultat de la commande ps -edf. Avec le nom des PID, et un fichier texte pour le nom du processus.
    - écrire un script bash pour produire un fichier de la forme de la sortie de ps -edf. L’inverse de la première commande.

    L’inverse de la première commande.

    vue la précision du sujet, je crois qu'il y a quelqu'un qui ne veut pas que tu réussisses ton semestre.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Janvier 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Janvier 2017
    Messages : 8
    Points : 8
    Points
    8
    Par défaut
    Est ce que, écris comme ça, c'est plus clair ?
    Merci :p !

    Le but du projet est de créer l’arborescence résultant de la commande ps -edf. Tout comme chaque
    répertoire a un répertoire parent, chaque processus en a un aussi. Il faudra donc créer l’arborescence sur ce
    modèle. Les répertoires auront le nom des PID correspondant. Dans chaque répertoire, un fichier texte sera
    créer contenant le nom du processus ( CMD )
    Nous appellerons cette commande arbo_ps.sh et nous l’implémenterons d’une option d’aide -h ou --helpqui renverra l’aide suivante : ....
    consiste à écrire et à tester un script bash qui produit un fichier
    2eme question :Consiste à écrire et tester un script bash de la forme de la sortie de ps -edf depuis une arborescence donnée. C’est en fait l’effet inverse de la première commande.


    J'ai fais ps -edf du coup j'ai tout mais il faut que je trie selon les parents et tout ça ..

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 550
    Points : 19 383
    Points
    19 383
    Par défaut
    trier ? non. ce n'est pas nécessaire. du moins, pour la première partie.

    tu peux déjà partir sur Comment parcourir un fichier, car cela s'applique aussi, en l'adaptant, au parcours de la sortie d'une commande.

    la deuxième partie semble requérir davantage d'astuces, car il faut parcourir une hiérarchie, mais les fonctionnalités avancées de bash doivent permettre de simplifier ce cheminement en lecture ligne à ligne...
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    à vue de pif comme ça j'aurais tendance à penser "récursif" de manière à simplifier grandement les choses, sachant qu'à la racine on ne doit donc avoir qu'un répertoire 1/ qui correspond à init

  6. #6
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 278
    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 278
    Points : 12 726
    Points
    12 726
    Par défaut
    Bonjour,

    Non, à la racine, tu peux en avoir plus:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UID         PID   PPID  C STIME TTY          TIME CMD
    root          1      0  0  2016 ?        00:08:55 /sbin/init
    root          2      0  0  2016 ?        00:00:07 [kthreadd]
    Ici, une simple boucle peut aussi le faire:
    Pour chaque ligne on récupère le PPID, le PID et le CMD et on passe simplement les 2 commandes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mkdir -p ${PPID}/${PID}
    echo "$CMD" >${PPID}/${PID}/CMD
    Ici, il reste juste à gérer les cas PPID=0 ou on considère que 0 est le répertoire racine.
    Cordialement.

  7. #7
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Non, à la racine, tu peux en avoir plus:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UID         PID   PPID  C STIME TTY          TIME CMD
    root          1      0  0  2016 ?        00:08:55 /sbin/init
    root          2      0  0  2016 ?        00:00:07 [kthreadd]
    oui je m'en suis rendu compte en testant, donc à la racine c'est un unique répertoire 0/ plutôt

    Ici, une simple boucle peut aussi le faire:
    Pour chaque ligne on récupère le PPID, le PID et le CMD et on passe simplement les 2 commandes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mkdir -p ${PPID}/${PID}
    echo "$CMD" >${PPID}/${PID}/CMD
    sauf que ton $PID a peut-être lui aussi des processus enfants

    perso j'ai testé en récursif ça passe crème, en revanche pour la 2nde partie, on est d'accord qu'à partir d'un fichier qui ne contient que pid,ppid,cmd on ne peut pas reconstituer l'output de ps -edf qui contient également le user, l'horodatage, les arguments, le pty etc.

    edit: par ailleurs gaffe à $PID et $PPID qui sont des variables protégées déjà existantes, on utilisera plutôt $pid en minuscule

  8. #8
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 278
    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 278
    Points : 12 726
    Points
    12 726
    Par défaut
    Ma reflexion sur la création des répertoires est vraiment naze, dés fois (souvent ), je devrais retourner ma solution 7 fois avant de la proposer.
    Ici, va savoir pourquoi, PPID était un saut direct dans le bon répertoire...

    Sinon, pour le nommage des variables, on est bien d'accord, ici j'étais juste dans la reflexion...
    Cordialement.

  9. #9
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 882
    Points
    7 882
    Par défaut
    Voilà une solution portable en awk :

    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
    19
    20
    ps -e -o pid= -o ppid= -o comm= | awk -v quote="'" '{
      pid=$1
      ppid=$2
      command[pid]=$3
      parent[pid]=ppid
    }
    END {
      for(p in command) {
        path=p
        comm=command[p]
        while(parent[p] != "" && parent[p] != p) {
          path=parent[p] "/" path
          p=parent[p]
        }
        cmd=sprintf("mkdir -p %s && printf \"%%s\n\" %s%s%s > %s/command",path,quote,comm,quote,path)
        system(cmd)
        close(cmd)
      }
    }
    '
    ɹǝsn *sıɹɐlos*

  10. #10
    Membre habitué Avatar de RaphaelG
    Homme Profil pro
    Amateur
    Inscrit en
    Juin 2016
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Juin 2016
    Messages : 94
    Points : 183
    Points
    183
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     mkdir -p ${PPID}/${PID}
    echo "$CMD" >${PPID}/${PID}/CMD
    Heu ... Dans l'énoncé de l'exercice, il est question d'arborescence mais êtes vous sùr qu'il est sous entendu arborescence de fichier ?
    Ne serait il pas plutôt une représentation de l'arborescence affichée à l'écran comme le ferait la commande "ps -ejH" ?
    IMHO, you should RTFM ASAP. IHTH.

  11. #11
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 882
    Points
    7 882
    Par défaut
    Non, on n'en est pas sûr mais c'est l'interprétation qu'en a fait Gnolls.

    Sinon, il y a aussi la commande "pstree -p" qui est pas mal ...
    ɹǝsn *sıɹɐlos*

  12. #12
    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 RaphaelG Voir le message
    Heu ... Dans l'énoncé de l'exercice, il est question d'arborescence mais êtes vous sùr qu'il est sous entendu arborescence de fichier ?
    Ne serait il pas plutôt une représentation de l'arborescence affichée à l'écran comme le ferait la commande "ps -ejH" ?
    La réponse est dans l'énoncé (du moins, dans ce que tu nous as transmis):

    Citation Envoyé par Gnolls Voir le message
    Le but du projet est de créer l’arborescence résultant de la commande ps -edf. Tout comme chaque
    répertoire a un répertoire parent, chaque processus en a un aussi. Il faudra donc créer l’arborescence sur ce
    modèle. Les répertoires auront le nom des PID correspondant. Dans chaque répertoire, un fichier texte sera
    créer
    contenant le nom du processus ( CMD )
    Les erreurs orthographiques sont-elles d'origine?


    Par ailleurs, attention:
    Citation Envoyé par disedorgue Voir le message
    Pour chaque ligne on récupère le PPID, le PID et le CMD et on passe simplement les 2 commandes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mkdir -p ${PPID}/${PID}
    echo "$CMD" >${PPID}/${PID}/CMD
    comme déjà mentionné par disedorgue , il faut trouver la bonne place de ${PPID} dans l'arborescence...

    d'où quelques pistes:
    - piste #1:
    on fait tout en ram (comme la solution en "awk" proposée par Jiliagre), puis on crée l'arborescence en partant de la racine

    - piste #2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    on cherche le répertoire ${PPID}
    s'il n'existe pas déjà, 
    alors on le crée à la racine 
    fin si
     
    on cherche le répertoire ${PID}
    s'il n'existe pas déjà, 
    alors on le crée dans ${PPID}
    sinon si le répertoire ${PPID} n'est pas dans le répertoire ${PPID}, 
    alors on l'y déplace avec "mv"
    finsi

  13. #13
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 278
    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 278
    Points : 12 726
    Points
    12 726
    Par défaut
    Une solution itérative en bash, avec une option qui fonctionne au moins en gnu ps:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ps -edf --forest | sed '1d;s/ \\_ //' | while read A B C D E F G H
    do
      X=${X/\/$C*/}
      X="$X/$C"
      echo "mkdir -p .$X/$B"
      echo "echo $H >.$X/$B/CMD"
    done
    Ici, je fais des echo au lieu de lancer réellement les commandes...
    Cordialement.

  14. #14
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 882
    Points
    7 882
    Par défaut
    Attention, un nom de processus peut contenir à peu près n'importe quoi (des parenthèses, des métacaractères, des tirets, voire des pipes et des redirections, etc).

    Il faut le protéger contre toute interprétation par le shell. Je viens de modifier mon script awk pour mieux m'en prémunir.
    ɹǝsn *sıɹɐlos*

  15. #15
    Futur Membre du Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Janvier 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Janvier 2017
    Messages : 8
    Points : 8
    Points
    8
    Par défaut
    Pour la première partie j'étais partis sur une boucle while comme ça :
    Sauf que bien sur je n'arrivais pas au bout, le for je ne sais pas quoi mettre dedans.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while (( i -lt $ligne ))
    do 
    head -$l tmp | tall -l > tmp2
    for :
    let "i=i+1"
    done

    Il ne me semble pas qu'on est vu les scripts awk en cours ( ou alors je suis vraiment à l'ouest ) ducoup on ne peut l'utiliser. Que du bash.

    Merci beaucoup pour votre temps et vos pistes !!

    Bonne soirée

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 550
    Points : 19 383
    Points
    19 383
    Par défaut
    as-tu lu le tutoriel que je t'ai indiqué ?

    je l'ai écrit exprès pour toi*.

    ps -edf c'est une obligation incontournable, ou est-ce qu'on peut définir un formatage plus fin ?

    *heu, pour des personnes comme toi , qui débutent avec l'écriture de shell scripts.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  17. #17
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    une idée parmi d'autres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    {
        read line  # on saute la premiere ligne
        while read _ pid ppid _ _ _ _ cmd args; do
            :
        done
    } < <(ps -edf)

Discussions similaires

  1. [Système] executer une commande linux
    Par kirbs dans le forum Langage
    Réponses: 7
    Dernier message: 08/12/2005, 09h40
  2. Executer une commande linux distante
    Par g-rom3 dans le forum Linux
    Réponses: 11
    Dernier message: 06/11/2005, 19h33
  3. Exécuter une commande linux.
    Par casafa dans le forum Linux
    Réponses: 4
    Dernier message: 20/07/2005, 23h13
  4. Réponses: 1
    Dernier message: 30/04/2004, 11h36
  5. Réponses: 2
    Dernier message: 24/06/2003, 20h31

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