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

Programmation et administration système Perl Discussion :

Use of uninitialized value in concatenation


Sujet :

Programmation et administration système Perl

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Points : 137
    Points
    137
    Par défaut Use of uninitialized value in concatenation
    Bonjour,

    Voici mon script sur le retour de la commande top :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/usr/bin/perl
    use strict;
    use warnings;
     
    my @top = `top \-n 1 \-b \| grep \-v \'\\(average:\\\|\\Tasks:\\|\\Cpu\(s\):\\\|\\Mem:\\\|\\Swap\\|\\TIME+\\\)\'`;
    #print "@top \n";
     
    foreach my $line  (@top) {
            my @line=split (/\s+/,$line);
            print "Flag time :  $line[1] $line[11]\n";
            }
    En fait je pense qu'il devrait me montrer le login et la commande exécutée ce qui n'est pas tout le temps vrai car de fois j'ai le PID et des fois j'ai le login, en plus j'ai le message d'erreur suivant : Use of uninitialized value in concatenation (.) or string at ./test.pl line 10.

    Apparemment, j'ai des erreurs dans les scalaire variable $line[1] et $line[11]
    Comment pourrais je fixer cela ?

    Merci de votre aide.

  2. #2
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Si des fois @top ne contient pas 12 colonnes, tu aura ce message car la valeur de la colonne 12 est non existente.

    A toi de tester
    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
    #!/usr/bin/perl
    use strict;
    use warnings;
     
    my @top
      = `top -n 1 -b | grep -v \'\\(average:\\\|\\Tasks:\\|\\Cpu\(s\):\\\|\\Mem:\\\|\\Swap\\|\\TIME+\\\)\'`;
     
    #print "@top \n";
     
    foreach my $line (@top) {
      my @line = split( /\s+/, $line );
      print "Flag time : ";
      if ( $line[1] ) { print $line[1] . ' '; }
      if ( $line[11] ) { print $line[11]; }
      print "\n";
    }

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Points : 137
    Points
    137
    Par défaut
    Oui .... j'avais pensé à cela mais je pensais qu'il y avait un raccourci

    Tout cela est du que le résultat de top n'est pas très constant
    car des fois on a ces lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Flag time :  8906 0:00.03
    Flag time :  root sshd
    Mon but est de d'avoir le temps d’exécution d'un processus MATLAB, pour ne pas le nommer. La commande shell ps ne me donne pas cette valeur. Je pourrais rajouter un " | grep MATLAB" sur ma commande shell du top mais j'aimerais m’entraîner dans l'utilisation de grep dans Perl. J'ai parcouru plusieurs page et fais plusieurs essai non concluant.

    Comme faire?
    D'avance merci

  4. #4
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Regarde le module Proc::ProcessTable

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Points : 137
    Points
    137
    Par défaut
    Merci Djibril,

    Par contre il y a quelque zone d'ombre sur ce package.
    Exemple :

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    --------------------------------
    uid:  70059
    gid:  80000
    pid:  23540
    fname:  regss
    ppid:  23539
    pgrp:  23538
    sess:  23250
    ttynum:  0
    flags:  4202496
    minflt:  4998
    cminflt:  0
    majflt:  2632
    cmajflt:  0
    utime:  240000
    stime:  710000
    cutime:  0
    cstime:  0
    priority:  15
    start:  1319121479
    size:  75739136
    rss:  2179072
    wchan:  -1
    time:  950000
    ctime:  0
    state:  sleep
    euid:  70059
    suid:  70059
    fuid:  70059
    egid:  80000
    sgid:  80000
    fgid:  80000
    pctcpu:  0.00
    pctmem:  0.01
    cmndline:  regss 5
    exec:  /opt/mainwin520/mw/bin-linux_optimized/regss
    cwd:  /home/user1/.mw/core_data/veloce/registry_run
    --------------------------------
    Est ce que le résultat de temps est en seconde ?
    Quel est la différence entre utime et time ?

  6. #6
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Faudrait poser la question sur le forum Linux.
    Je ne connais pas la différence entre utime, ctime et time.

    Mais, je te recommande time (et c'est en secondes).

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Points : 137
    Points
    137
    Par défaut
    Voici un début de code déduit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #!/usr/bin/perl 
    use strict;
    use warnings;
    use Proc::ProcessTable;
     
    my $tproc = new Proc::ProcessTable;
     
    foreach my $proc ( @{$tproc->table} ){
    	my $test=$proc->cmndline;
    	if ($test =~ /MATLAB/) {
    		print "$test \n" ;
    	}
    }
    Je dois encore mettre la notion du temps d'utilisation et par qui

    Encore merci de tes renseignements

  8. #8
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Juste pour ton information Proc::ProcessTable::Process :
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    uid         UID of process
      gid         GID of process
      euid        effective UID of process           (Solaris only)
      egid        effective GID of process           (Solaris only)
      pid         process ID
      ppid        parent process ID
      spid        sprod ID                           (IRIX only)
      pgrp        process group
      sess        session ID
      cpuid       CPU ID of processor running on     (IRIX only)
      priority    priority of process
      ttynum      tty number of process
      flags       flags of process
      minflt      minor page faults                  (Linux only)
      cminflt     child minor page faults            (Linux only)
      majflt      major page faults                  (Linux only)
      cmajflt     child major page faults            (Linux only)
      utime       user mode time (1/100s of seconds) (Linux only)
      stime       kernel mode time                   (Linux only)
      cutime      child utime                        (Linux only)
      cstime      child stime                        (Linux only)
      time        user + system time                 
      ctime       child user + system time
      timensec    user + system nanoseconds part     (Solaris only)
      ctimensec   child user + system nanoseconds    (Solaris only)
      qtime       cumulative cpu time                (IRIX only)
      size        virtual memory size (bytes)
      rss         resident set size (bytes)
      wchan       address of current system call 
      fname       file name
      start       start time (seconds since the epoch)
      pctcpu      percent cpu used since process started
      state       state of process
      pctmem      percent memory                     
      cmndline    full command line of process
      ttydev      path of process's tty
      clname      scheduling class name              (IRIX only)

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Points : 137
    Points
    137
    Par défaut
    Pour loguer l'utilisation dans un fichier :
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    #!/usr/bin/perl 
    use strict;
    use warnings;
    use Proc::ProcessTable;
    use POSIX qw(strftime);
     
    my $Log_time= strftime "%Y_%m", localtime ;
    my $infile= "/opt/LOG/MATLAB_$Log_time.log";
    my $TIMESTAMP= strftime "TIMESTAMP %d\/%m\/%y %H\:%M", localtime ;
     
     
     
    my $tproc = new Proc::ProcessTable;
     
    foreach my $proc ( @{$tproc->table} ){
    	my $cmd=$proc->cmndline;
    	#my $depuis=scalar(localtime($proc->start));
    	my $depuis=$proc->start;
    	my $uid=$proc->uid;
    	my $pid=$proc->pid;
    	my $pctcpu=$proc->pctcpu;
    	my $pctmem=$proc->pctmem;
    	if (($cmd =~ /MATLAB/) && ($pctcpu >1 )) {
    		my $login=`getent passwd | grep $uid`;
    		my @login = split /\:/, $login;
    # 		print "MATLAB time: $pid $depuis $login[0] pctcpu: $pctcpu pctmem: $pctmem\n";
    		open (WRITE, ">>$infile");
    		print WRITE "$TIMESTAMP\n";
    		print WRITE "MATLAB time : $pid $login[0] $depuis  pctcpu: $pctcpu pctmem: $pctmem\n";
                    close (WRITE);
    	}
    }
    Encore merci

  10. #10
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Voici ton programme amélioré en terme de lisibilité. De plus, inutile d'ouvrir fermer le fichier x-fois.

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    #!/usr/bin/perl 
    use strict;
    use warnings;
    use Proc::ProcessTable;
    use POSIX qw(strftime);
     
    my $Log_time  = strftime "%Y_%m", localtime;
    my $infile    = "/opt/LOG/MATLAB_$Log_time.log";
    my $TIMESTAMP = strftime "TIMESTAMP %d\/%m\/%y %H\:%M", localtime;
     
    my $tproc = new Proc::ProcessTable;
     
    open my $fh_log, '>>', $infile or die "Impossible d'écrire dans le fichier $infile : $! \n";
    foreach my $proc ( @{ $tproc->table } ) {
      my $cmd = $proc->cmndline;
     
      #my $depuis=scalar(localtime($proc->start));
      my $depuis = $proc->start;
      my $uid    = $proc->uid;
      my $pid    = $proc->pid;
      my $pctcpu = $proc->pctcpu;
      my $pctmem = $proc->pctmem;
      if ( ( $cmd =~ /MATLAB/ ) && ( $pctcpu > 1 ) ) {
        my $login = `getent passwd | grep $uid`;
        my @login = split /\:/, $login;
     
        # 		print "MATLAB time: $pid $depuis $login[0] pctcpu: $pctcpu pctmem: $pctmem\n";
        print {$fh_log} "$TIMESTAMP\n";
        print {$fh_log} "MATLAB time : $pid $login[0] $depuis  pctcpu: $pctcpu pctmem: $pctmem\n";
      }
    }
    close $fh_log;

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Points : 137
    Points
    137
    Par défaut
    Djibril,
    Merci pour la correction
    Arrête moi si je me trompe mais mon script d'origine n'ouvrai le fichier que si la condition est remplie n'est ce pas ....? Pour moi, si la condition n'est pas remplie il saute les lignes suivantes cette dernière ??? ?



    Autre petite question comment fait on un printf dans un fichier???

  12. #12
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Citation Envoyé par dubis Voir le message
    Djibril,
    Merci pour la correction
    Arrête moi si je me trompe mais mon script d'origine n'ouvrai le fichier que si la condition est remplie n'est ce pas ....? Pour moi, si la condition n'est pas remplie il saute les lignes suivantes cette dernière ??? ?
    Oui c'est bien ça. La seule différence avec mon programme, c'est que tu n'ouvre le fichier qu'un seule fois.



    Citation Envoyé par dubis Voir le message
    Autre petite question comment fait on un printf dans un fichier???
    C'est comme print.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print FILEHANDLE sprintf(FORMAT, LIST);

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

Discussions similaires

  1. Use of uninitialized value in concatenation (.) or string
    Par pontarose dans le forum Langage
    Réponses: 2
    Dernier message: 28/10/2011, 13h26
  2. Use of uninitialized value in concatenation
    Par Jasmine80 dans le forum Langage
    Réponses: 3
    Dernier message: 23/06/2008, 13h19
  3. Use of uninitialized value in pattern match (m//)
    Par Vladkergan dans le forum Langage
    Réponses: 4
    Dernier message: 13/01/2008, 19h25
  4. [USE STRICT] uninitialized value in print ...
    Par pop_up dans le forum Langage
    Réponses: 4
    Dernier message: 24/04/2006, 14h18
  5. [langage] Use of uninitialized value
    Par Batou dans le forum Langage
    Réponses: 2
    Dernier message: 21/02/2005, 10h28

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