]> mj.ucw.cz Git - bex.git/blob - bprun
bprun: Maximum number of parallel jobs is configurable in BEX::Config
[bex.git] / bprun
1 #!/usr/bin/perl
2 # Batch EXecutor 2.0 -- Parallel Execution Using Screen
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 $queue_name;
14
15 GetOptions(
16         "q|queue=s" => \$queue_name,
17 ) or die <<AMEN ;
18 Usage: bprun [<options>] [[!]<machine-or-class> ...]
19
20 Options:
21 -q, --queue=<name>      Run jobs in the given queue
22 AMEN
23
24 $ENV{'STY'} or die "Please run me under Screen\n";
25 my @machines = BEX::Config::parse_machine_list(@ARGV ? @ARGV : '*');
26 my $queue = BEX::Queue->new($queue_name);
27
28 my $fifo_name = $queue->{'Name'} . '/status-fifo';
29 unlink $fifo_name;
30 mkfifo $fifo_name, 0700 or die "Cannot create $fifo_name: $!";
31 open FIFO, '+<', $fifo_name or die "Cannot open $fifo_name: $!";
32
33 my %running = ();
34 my $max = $BEX::Config::max_parallel_jobs;
35
36 while (%running || @machines) {
37         if (@machines && keys %running < $max) {
38                 my $mach = shift @machines;
39                 $queue->scan($mach) or next;
40                 print "$mach: START\n";
41                 system 'screen', '-t', $mach, './brun', "--status-fifo=$fifo_name", $mach;
42                 !$? or print "$mach: Failed to run!\n";
43                 $running{$mach} = 'START';
44                 next;
45         }
46         $_ = <FIFO>;
47         chomp;
48         my ($mach, $jid, $stat) = /^! (\S+) (\S+) (\S+)$/;
49         if (!defined $stat) {
50                 print "ERROR: Received invalid status message <$_>\n";
51                 next;
52         }
53         if (!defined $running{$mach}) {
54                 print "ERROR: Received status message <$_> for a machine which does not run\n";
55                 next;
56         }
57         $running{$mach} = $stat . ($jid eq '-' ? "" : ":$jid");
58         print "$mach: ", $running{$mach}, "\n";
59         if ($stat eq 'DONE') {
60                 delete $running{$mach};
61         }
62 }
63
64 close FIFO;
65 unlink $fifo_name;