]> mj.ucw.cz Git - bex.git/blob - bq
Let default prolog ask for set -e
[bex.git] / bq
1 #!/usr/bin/perl
2 # Batch EXecutor 2.0 -- Show Queued Jobs
3 # (c) 2011 Martin Mares <mj@ucw.cz>
4
5 use strict;
6 use warnings;
7 use Getopt::Long;
8 use POSIX;
9
10 use lib 'lib';
11 use BEX;
12
13 my $by_host;
14 my $queue_name;
15 my $given_job;
16
17 GetOptions(
18         "h|by-host!" => \$by_host,
19         "j|job=s" => \$given_job,
20         "q|queue=s" => \$queue_name,
21 ) or die <<AMEN ;
22 Usage: bq [<options>] [[!]<machine-or-class> ...]
23
24 Options:
25 -h, --by-host           Show jobs sorted by host (default: by job)
26 -j, --job=<id>          Show only instances of the specified job
27 -q, --queue=<name>      Show jobs in the given queue
28 AMEN
29
30 my @machines = BEX::Config::parse_machine_list(@ARGV ? @ARGV : '*');
31 my $queue = BEX::Queue->new($queue_name);
32
33 my %jobs = ();
34 my %machs = ();
35 my %subj = ();
36 my %stat = ();
37 my %mach_locked = ();
38 for my $m (@machines) {
39         $mach_locked{$m} = $queue->is_locked($m, undef);
40         for my $j ($queue->scan($m)) {
41                 if (defined $given_job) {
42                         next if $j ne $given_job;
43                 }
44                 push @{$jobs{$j}}, $m;
45                 push @{$machs{$m}}, $j;
46                 my $job = $queue->job_metadata($j);
47                 $subj{$j} = ' (' . $job->{'Subject'} . ')';
48
49         }
50 }
51
52 # Read status of each job
53 for my $m (keys %machs) {
54         for my $j (@{$machs{$m}}) {
55                 my $st = $queue->read_job_status($m, $j);
56                 if (defined($st->{'Time'}) && defined($st->{'Status'})) {
57                         $stat{$m}{$j} = ' [' . $st->{'Status'} . ' on ' .
58                                         POSIX::strftime('%Y-%m-%d', localtime $st->{'Time'}) . ']';
59                 } else {
60                         $stat{$m}{$j} = '';
61                 }
62                 if ($mach_locked{$m} || $queue->is_locked($m, $j)) {
63                         $stat{$m}{$j} .= ' [LOCKED]';
64                 }
65         }
66 }
67
68 if ($queue->is_locked(undef, undef)) {
69         print "### Queue lock present\n\n";
70 }
71
72 if ($by_host) {
73         for my $m (sort keys %machs) {
74                 print "$m", ($mach_locked{$m} ? ' [LOCKED]' : ''), "\n";
75                 for my $j (@{$machs{$m}}) {
76                         print "\t$j", $subj{$j}, $stat{$m}{$j}, "\n";
77                 }
78         }
79 } else {
80         for my $j (sort keys %jobs) {
81                 print $j, $subj{$j}, "\n";
82                 for my $m (sort @{$jobs{$j}}) {
83                         print "\t$m", $stat{$m}{$j}, "\n";
84                 }
85         }
86 }