#!/usr/bin/perl # Batch EXecutor 2.0 -- Parallel Execution Using Screen # (c) 2011 Martin Mares use strict; use warnings; use Getopt::Long; use POSIX; use lib 'lib'; use BEX; my $queue_name; GetOptions( "q|queue=s" => \$queue_name, ) or die <] [[!] ...] Options: -q, --queue= Run jobs in the given queue AMEN $ENV{'STY'} or die "Please run me under Screen\n"; my @machines = BEX::Config::parse_machine_list(@ARGV ? @ARGV : '*'); my $queue = BEX::Queue->new($queue_name); my $fifo_name = $queue->{'Name'} . '/status-fifo'; unlink $fifo_name; mkfifo $fifo_name, 0700 or die "Cannot create $fifo_name: $!"; open FIFO, '+<', $fifo_name or die "Cannot open $fifo_name: $!"; my %running = (); my $max = $BEX::Config::max_parallel_jobs; while (%running || @machines) { if (@machines && keys %running < $max) { my $mach = shift @machines; $queue->scan($mach) or next; print "$mach: START\n"; system 'screen', '-t', $mach, './brun', "--status-fifo=$fifo_name", $mach; !$? or print "$mach: Failed to run!\n"; $running{$mach} = 'START'; next; } $_ = ; chomp; my ($mach, $jid, $stat) = /^! (\S+) (\S+) (\S+)$/; if (!defined $stat) { print "ERROR: Received invalid status message <$_>\n"; next; } if (!defined $running{$mach}) { print "ERROR: Received status message <$_> for a machine which does not run\n"; next; } $running{$mach} = $stat . ($jid eq '-' ? "" : ":$jid"); print "$mach: ", $running{$mach}, "\n"; if ($stat eq 'DONE') { delete $running{$mach}; } } close FIFO; unlink $fifo_name;