User Tools

Site Tools


tutorials:perl:execute.3.pl
execute.3.pl
#!/usr/bin/perl -w
 
my $script_name = 'execute.3.pl';
 
# Chih-Horng Kuo <chkuo@lifedev.org>
# execute all .sh in the in_dir
# v3 2010/02/04
#   style change
# v2 2009/06/18
# v1 2006/05/03
 
use strict;
use warnings;
 
use Getopt::Long;
 
my $in_dir;
my $exe_dir;
my $in_file_ext;
my $batch_file_ext;
my $log_file_ext;
my $prefix;    # prefix of batch files
my $n_job;     # split into n batch files
my $debug;
 
GetOptions(
    "in_dir=s"         => \$in_dir,
    "exe_dir=s"        => \$exe_dir,
    "in_file_ext=s"    => \$in_file_ext,
    "batch_file_ext=s" => \$batch_file_ext,
    "log_file_ext=s"   => \$log_file_ext,
    "prefix=s"         => \$prefix,
    "n_job=i"          => \$n_job,
    "debug=i"          => \$debug,
);
$prefix         = $prefix         ? $prefix         : 'job';
$in_file_ext    = $in_file_ext    ? $in_file_ext    : 'sh';
$batch_file_ext = $batch_file_ext ? $batch_file_ext : 'sh';
$log_file_ext   = $log_file_ext   ? $log_file_ext   : 'log';
 
system "mkdir -p $exe_dir" unless -e $exe_dir;
 
my %job_id_HoA;    # key = job_id, value = array of file_id
my $count = 0;
opendir( DIR, $in_dir ) or die "can't open $in_dir: $!";
while ( defined( my $in_file = readdir(DIR) ) ) {
    if ( $in_file =~ /(\S+)\.$in_file_ext$/ ) {
        my $job_id = ( $count % $n_job ) + 1;
        push @{ $job_id_HoA{$job_id} }, $1;
        $count++;
    }
}
closedir(DIR);
 
foreach my $job_id ( sort keys %job_id_HoA ) {
    my $batch_file = $exe_dir . $prefix . $job_id . '.' . $batch_file_ext;
    my $log_file   = $exe_dir . $prefix . $job_id . '.' . $log_file_ext;
    open OUT, ">$batch_file" or die "Can't open output file $batch_file: $!\n";
 
    # shell
    print OUT '#!/bin/bash', "\n";
    foreach my $file_id ( @{ $job_id_HoA{$job_id} } ) {
        print OUT "$in_dir$file_id\.$in_file_ext\n";
    }
 
    close OUT;
    system "chmod +x $batch_file";
    system "$batch_file > $log_file 2>&1 &";
    print "command: $batch_file > $log_file 2>&1 &\n";
}
 
exit(0);
tutorials/perl/execute.3.pl.txt · Last modified: 2012/06/15 00:29 by chkuo