home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / languages / perl / tutorial / eg / convex / bacctsum next >
Encoding:
Text File  |  1990-07-18  |  5.6 KB  |  169 lines

  1. #!/usr/bin/perl
  2.  
  3. #
  4. # this output generated from my pstruct perl script, available upon request
  5. # it's only here so i can figure out the structure lay out
  6. #
  7. # struct rusage {
  8. #     struct timeval ru_utime;                 00000000 rusage.ru_utime
  9. #     struct timeval ru_stime;                 00000008 rusage.ru_stime
  10. #     long ru_maxrss;                          00000010 rusage.ru_maxrss
  11. #     long ru_ixrss;                           00000014 rusage.ru_ixrss
  12. #     long ru_idrss;                           00000018 rusage.ru_idrss
  13. #     long ru_isrss;                           0000001c rusage.ru_isrss
  14. #     long ru_minflt;                          00000020 rusage.ru_minflt
  15. #     long ru_majflt;                          00000024 rusage.ru_majflt
  16. #     long ru_nswap;                           00000028 rusage.ru_nswap
  17. #     long ru_inblock;                         0000002c rusage.ru_inblock
  18. #     long ru_oublock;                         00000030 rusage.ru_oublock
  19. #     long ru_msgsnd;                          00000034 rusage.ru_msgsnd
  20. #     long ru_msgrcv;                          00000038 rusage.ru_msgrcv
  21. #     long ru_nsignals;                        0000003c rusage.ru_nsignals
  22. #     long ru_nvcsw;                           00000040 rusage.ru_nvcsw
  23. #     long ru_nivcsw;                          00000044 rusage.ru_nivcsw
  24. #     struct timeval ru_exutime;               00000048 rusage.ru_exutime
  25. # };
  26. # sizeof(struct rusage) = 0x50 bytes
  27.  
  28. $rusage_size = 0x50;  # unused
  29. $rusage_t = 'L22';
  30.  
  31. # struct batch_acct {
  32. #     char quename[MAX_QUEUENAME+1];           00000000 batch_acct.quename
  33. #     char host[MAXHOSTNAMELEN+1];             00000010 batch_acct.host
  34. #     time_t submit_time;                      00000054 batch_acct.submit_time
  35. #     time_t complete_time;                    00000058 batch_acct.complete_time
  36. #     uid_t uid;                               0000005c batch_acct.uid
  37. #     gid_t gid;                               0000005e batch_acct.gid
  38. #     long aid;                                00000060 batch_acct.aid
  39. #     long seqno;                              00000064 batch_acct.seqno
  40. #     char rhost[MAXHOSTNAMELEN+1];            00000068 batch_acct.rhost
  41. #     short rpriority;                         000000aa batch_acct.rpriority
  42. #     short qpriority;                         000000ac batch_acct.qpriority
  43. #     short nice;                              000000ae batch_acct.nice
  44. #     struct rusage rusage;                    000000b0 batch_acct.rusage
  45. #     int reserved[8];                         00000100 batch_acct.reserved
  46. # };
  47. # sizeof(struct batch_acct) = 0x120 bytes
  48.  
  49. $batch_acct_size = 0x120;
  50. $batch_acct_t = 'A16A65x3LLSSLLA65xsssa80i8';
  51.  
  52. ( $program = $0 ) =~ s:.*/::;
  53.  
  54. $ok = 'vlq';
  55. while ($ARGV[0] =~ /^-./) {
  56.     $_ = shift;
  57.     s/^-//;
  58.     foreach $flag (split(//)) {
  59.         if ( $ok !~ /$flag/ ) {
  60.             printf stderr "unknown flag: %s\n", $flag;
  61.             die "usage: $program [-$ok] [batch_acct_file ...]\n";
  62.         }
  63.         die "$program: '$flag' flag already set\n" if $flags{$flag}++;
  64.     }
  65. }
  66.  
  67. # set all flags if none set
  68. @flags{'v','l','q'} = (1,1,1) 
  69.     unless $flags{'v'} || $flags{'l'} || $flags{'q'};
  70.  
  71. unshift (@ARGV, '-') if $#ARGV < $[;  # snatch stdin back
  72.  
  73. $batch_acct = '.' x $batch_acct_size;  # don't actually need to pre-extend
  74.  
  75. $MILLION = 1e6;
  76.  
  77.  
  78. while ( $file = shift ) {
  79.    open file || die "$program: can't open $file: $!, aborting";
  80.    while (read(file,$batch_acct,$batch_acct_size) == $batch_acct_size) {
  81.  
  82.     $records++;
  83.  
  84.     ( $quename, $host, $submit_time, $complete_time, 
  85.       $uid, $gid, $aid, $seqno, $rhost, $rpriority, 
  86.       $qpriority, $nice, $rusage, $reserved ) 
  87.           = unpack ( $batch_acct_t, $batch_acct );
  88.  
  89.     ( $utime_sec, $utime_usec, $stime_sec, $stime_usec,
  90.       $maxrss, $ixrss, $idrss, $isrss, $minflt, $majflt,
  91.       $nswap, $inblock, $oublock, $msgsnd, $msgrcv, $nsignals,
  92.       $nvcsw, $nivcsw, $exutime_sec, $exutime_usec ) 
  93.           = unpack ( $rusage_t, $rusage );
  94.  
  95.     $utime = $utime_sec + ($utime_usec/$MILLION);
  96.     $stime = $stime_sec + ($stime_usec/$MILLION);
  97.  
  98.     $login = &login($uid);
  99.  
  100.     if ( $flags{'v'} ) {  
  101.         printf("%-8s %-8s %3d %s %8.2fu %8.2fs\n",
  102.         $quename, $login, $nice, &mktime($submit_time), $utime, $stime);
  103.     }
  104.  
  105.     if ( $flags{'l'} ) {
  106.         $ujobs{$login}++;
  107.         $uutimes{$login} += $utime;
  108.         $ustimes{$login} += $stime;
  109.     }
  110.  
  111.     if ( $flags{'q'} ) {
  112.         $qjobs{$quename}++;
  113.         $qutimes{$quename} += $utime;
  114.         $qstimes{$quename} += $stime;
  115.     }
  116.    } 
  117.  
  118. printf "\nbatch accounting records: %d\n", $records if $flags{'v'};
  119.  
  120. if ( $flags{'l'} ) {
  121.     print "\nsummary by login\n" if $flags{'v'} || $flags{'q'};
  122.  
  123.     foreach $login (sort keys %ujobs) {
  124.     printf("%-8s %5d %12.2fu %12.2fu\n",
  125.         $login, $ujobs{$login}, $uutimes{$login}, $ustimes{$login});
  126.     } 
  127. }
  128.  
  129. if ( $flags{'q'} ) {
  130.     print "\nsummary by queue\n" if $flags{'v'} || $flags{'l'};
  131.  
  132.     foreach $queue (sort keys %qjobs) {
  133.     printf("%-8s %5d %12.2fu %12.2fu\n",
  134.         $queue, $qjobs{$queue}, $qutimes{$queue}, $qstimes{$queue});
  135.     } 
  136. }
  137.  
  138. exit 0;
  139.  
  140. sub login {
  141.     local($id) = @_;
  142.     local($name, $passwd, $uid, $gid, $quota, $comment, $gdocs, $dir, $shell);
  143.  
  144.     $name = '';
  145.  
  146.     if (!defined $login{$id}) {
  147.  
  148.     ($name, $passwd, $uid, $gid, $quota, 
  149.      $comment, $gdocs, $dir, $shell) = getpwuid($id);
  150.  
  151.     $login{$id} = ($name ne '') ? $name : sprintf("#%d", $id);
  152.     } 
  153.     return $login{$id};
  154.  
  155. sub mktime {
  156.     local($time) = @_;
  157.     local($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst);
  158.     local($date);
  159.     
  160.     ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst)
  161.           = localtime($time);
  162.     $mon+1;
  163.  
  164.     sprintf("%02d/%02d/%02d %02d:%02d", $mday, $mon, $year, $hour, $min);
  165.