Changeset 30457 for trunk/tools/psstatus
- Timestamp:
- Feb 2, 2011, 11:52:19 AM (15 years ago)
- File:
-
- 1 edited
-
trunk/tools/psstatus (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/tools/psstatus
r28940 r30457 19 19 my $dbuser; 20 20 my $dbpassword; 21 my $use_mysql = 1;22 21 my $verbose; 22 my $finishing; 23 23 24 24 GetOptions( 25 25 'running|r', \$running, 26 26 'finished|f', \$finished, 27 'finishing', \$finishing, 27 28 'req_faulted', \$req_faulted, 28 29 'job_faulted', \$job_faulted, … … 32 33 ) or pod2usage (2); 33 34 34 pod2usage( -msg => "Unknown option: @ARGV", -exitval => 2 ) if @ARGV; 35 pod2usage( -msg => "Unknown option: @ARGV", -exitval => 2 ) if @ARGV ; 36 37 $running = 1 if (!$finished and !$finishing and !$running); 35 38 36 39 my $no_args = ! (defined $running or defined $finished or defined $req_faulted or defined $job_faulted ); … … 42 45 my $dbh = getDBHandle(); 43 46 44 my $jobLabel = $running ? "Running jobs" : "Num Jobs"; 45 my $select = "SELECT req_id, name, label, reqType, pstampRequest.state, pstampRequest.fault, count(job_id) AS '$jobLabel', timestamp"; 46 47 $select .= ", outdir" if ($verbose); 48 my $from = " FROM pstampRequest LEFT JOIN pstampJob USING(req_id)"; 49 my $where = " WHERE (pstampRequest.state NOT like '%cleaned')"; 50 51 my $sql = $select . $from . $where; 52 53 $limit = 20 if ($no_args); 54 # if ($no_args and $limit) { 55 if (0 and $limit) { 56 # use mysql to get the last_req_id 57 # this works but it prints out the @last_req_id value which is distracting. Use dbi for the query 58 my $where = ""; 59 if ($running) { 60 $where = " WHERE pstampRequest.state = 'run' OR pstampRequest.state = 'new'"; 61 } elsif ($finished) { 62 $where = " WHERE pstampRequest.state = 'stop'"; 63 } 64 my $stmt = $dbh->prepare("SELECT req_id FROM pstampRequest $where ORDER BY req_id DESC LIMIT 1"); 65 $stmt->execute(); 66 my $row = $stmt->fetchrow_hashref(); 67 die "failed to get last req_id\n" if !$row; 68 my $last_req_id = $row->{req_id}; 69 die "failed to get last req_id\n" if !$last_req_id; 70 71 my $first_req_id_to_select = $last_req_id - $limit + 1; 72 $sql .= " AND (req_id >= $first_req_id_to_select)"; 73 } 74 if ($running) { 75 $sql .= " AND (pstampRequest.state = 'new' OR pstampRequest.state = 'run') AND (pstampJob.state = 'run' OR pstampJob.state IS NULL)"; 76 } elsif ($finished) { 77 $sql .= " AND (pstampRequest.state = 'stop') AND date_add(timestamp, interval 1 day) >=utc_timestamp()" 78 } 79 if ($req_faulted) { 80 $sql .= " AND (pstampRequest.fault > 0)"; 81 } 82 if ($job_faulted) { 83 $sql .= " AND (pstampJob.fault > 0 AND pstampJob.fault < 10)"; 84 } 85 $sql .= " GROUP BY req_id"; 86 47 my $running_query = " 48 SELECT 49 unfinishedReq.req_id, 50 name, 51 label, 52 reqType 53 state, 54 fault, 55 IFNULL(runningJobs, 0) AS 'Pending Jobs', 56 IFNULL(faultedJobs, 0) AS 'Faulted Jobs', 57 IFNULL(completedJobs,0) AS 'Completed Jobs', 58 timestamp AS 'last state change (UTC)' 59 FROM ( 60 SELECT 61 req_id, 62 name, 63 label, 64 reqType, 65 pstampRequest.state, 66 pstampRequest.fault, 67 timestamp 68 FROM pstampRequest 69 WHERE pstampRequest.state = 'run' or pstampRequest.state ='new' 70 ) as unfinishedReq 71 LEFT JOIN ( 72 SELECT req_id, 73 count(job_id) AS runningJobs 74 FROM pstampRequest JOIN pstampJob USING(req_id) 75 WHERE (pstampRequest.state = 'run' or pstampRequest.state ='new') 76 AND pstampJob.state = 'run' 77 AND pstampJob.fault = 0 78 GROUP BY req_id 79 ) as runningJobs 80 ON unfinishedReq.req_id = runningJobs.req_id 81 LEFT JOIN ( 82 SELECT req_id, 83 count(job_id) AS faultedJobs 84 FROM pstampRequest JOIN pstampJob USING(req_id) 85 WHERE (pstampRequest.state = 'run' or pstampRequest.state ='new') 86 AND pstampJob.state = 'run' 87 AND pstampJob.fault > 0 88 GROUP BY req_id 89 ) as faultedJobs 90 ON unfinishedReq.req_id = faultedJobs.req_id 91 LEFT JOIN ( 92 SELECT req_id, 93 count(job_id) AS completedJobs 94 FROM pstampRequest JOIN pstampJob USING(req_id) 95 WHERE (pstampRequest.state = 'run' or pstampRequest.state ='new') 96 AND pstampJob.state = 'stop' 97 GROUP BY req_id 98 ) as finishedJobs 99 ON unfinishedReq.req_id = finishedJobs.req_id 100 101 ORDER by unfinishedReq.req_id 102 "; 103 104 my $finishing_query = " 105 SELECT 106 req_id, 107 name, 108 label, 109 reqType, 110 pstampRequest.state, 111 pstampRequest.fault, 112 count(job_id) as 'Finished jobs', 113 timestamp as 'last state change' 114 FROM pstampRequest 115 JOIN pstampJob USING(req_id) 116 WHERE pstampRequest.state ='run' 117 AND ( 118 SELECT count(job_id) FROM pstampJob 119 WHERE pstampJob.req_id = pstampRequest.req_id 120 AND pstampJob.state != 'stop' 121 ) = 0 122 GROUP BY req_id 123 ORDER by req_id 124 "; 125 126 my $finished_query = " 127 SELECT 128 finishedReq.req_id, 129 name, 130 label, 131 reqType, 132 IFNULL(success, 0) AS 'Successful Jobs', 133 IFNULL(faulted,0) AS 'Faulted Jobs', 134 timestamp AS 'Completion Time (UTC)' 135 FROM ( 136 SELECT 137 req_id, 138 name, 139 label, 140 reqType, 141 -- pstampRequest.state, 142 -- pstampRequest.fault, 143 timestamp 144 FROM pstampRequest 145 WHERE pstampRequest.state = 'stop' 146 AND date_add(timestamp, interval 1 day) >=utc_timestamp() 147 ) as finishedReq 148 LEFT JOIN ( 149 SELECT req_id, 150 count(job_id) AS success 151 FROM pstampRequest JOIN pstampJob USING(req_id) 152 WHERE pstampRequest.state = 'stop' 153 AND date_add(timestamp, interval 1 day) >=utc_timestamp() 154 AND pstampJob.fault = 0 155 GROUP BY req_id 156 ) as successfulJobs 157 ON finishedReq.req_id = successfulJobs.req_id 158 LEFT JOIN ( 159 SELECT req_id, 160 count(job_id) AS faulted 161 FROM pstampRequest JOIN pstampJob USING(req_id) 162 WHERE pstampRequest.state = 'stop' 163 AND date_add(timestamp, interval 1 day) >=utc_timestamp() 164 AND pstampJob.fault > 0 165 GROUP BY req_id 166 ) as faultedJobs 167 ON finishedReq.req_id = faultedJobs.req_id 168 ORDER by timestamp desc 169 "; 170 171 172 my $sql; 87 173 if ($finished) { 88 $sql .= " ORDER BY timestamp DESC"; 89 } 174 $sql = $finished_query; 175 } elsif ($running) { 176 $sql = $running_query; 177 } elsif ($finishing) { 178 $sql = $finishing_query; 179 } else { 180 die "can't happen"; 181 } 182 90 183 if ($limit and !$no_args) { 91 184 $sql .= " LIMIT $limit"; 92 185 } 93 186 94 if ($use_mysql){187 { 95 188 # print STDERR "$sql\n"; 96 189 my @args = ( "--table", "--user=$dbuser", "--host=$dbserver", "--password=$dbpassword", $dbname); … … 98 191 push @args, '--verbose' if $verbose; 99 192 100 open my $mysql, "|-", 'mysql', @args or die "failed to run mysql\n"; 101 print $mysql "$sql;\n"; 102 close $mysql; 103 104 } else { 105 # I thought that I wanted custom formatting but in the end I figured I'd just use mysql 106 107 my $stmt = $dbh->prepare($sql); 108 $stmt->execute(); 109 110 my $head = "| req_id | name | label | reqType | state | fault | numJobs | outdir"; 111 my $head2= "-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------"; 112 # | 5499 | cclin_20100522T011813 | WEB.UP | pstamp | stop | 0 | 1 |/data/ippdb02.0/pstamp/work/20100521/5517" 113 114 my $printhead = 1; 115 my $count = 0; 116 while ( my $row = $stmt->fetchrow_hashref() ) { 117 $count++; 118 if ($printhead) { 119 print "$head\n"; 120 print "$head2\n"; 121 $printhead = 0; 122 } 123 printf "|%7d | %-64s| %-16s| %-10s| %-6s| %6d | %10d | %-s |\n", 124 $row->{req_id}, be_safe($row->{name}), $row->{label}, be_safe($row->{reqType}), $row->{state}, $row->{fault}, 125 $row->{numJobs}, $row->{outdir}; 126 } 127 128 if (!$count) { 129 print "no requests found\n"; 130 } else { 131 print "$head2\n"; 132 } 193 open my $mysql_pipe, "|-", 'mysql', @args or die "failed to run mysql\n"; 194 print $mysql_pipe "$sql;\n"; 195 close $mysql_pipe; 133 196 134 197 } 135 198 136 199 exit 0; 137 138 sub be_safe {139 my $str = shift;140 141 return $str ? $str : 'null';142 }143 200 144 201
Note:
See TracChangeset
for help on using the changeset viewer.
