Here's two of my peices of choppy code (QUEUETEST, ENTRYTEST) back from
when I was figuring out VMS::Queue myself.
Obviously, they aren't the prettiest, but they do exercise a lot of
VMS::Queue, which may help you figure it out.
Also, here's the module I was really wanting to get when I was messing
with the two examples (SUBMITJOB.PM). In it a provide to perl subs, one
to submit some random DCL to a queue, and one to submit some DCL, and
wait for it to complete. Parameters are the DCL to submit, and then
optional queue name, optional user to submit as, optionally specify a
temp file name to use, and optionally specify a log file.
I really should have coded these routines to take a sparse hash (e.g.
submitjob ({CMD=>"$ show date", LOGFILE=>'sys$scratch:foo.log'})
instead of using positional parameters, but I was still learning perl at
the time.
-- Pat
Martin Zinser wrote:
>
> Hello!
>
> I just started to play around with VMS::Queue and may be I'm just
> dense
> (most probably even since I've got a bad cold). I try
> something like this:
>
> use VMS::Queue;
> %entry_cond = {jobname=>"BATSER"};
> @entries = VMS::Queue::entry_list(\%entry_cond);
> for ($i==0;$i<=$#entries;$i++) {print $entries[$i], "\n"};
>
> \%entryprop = VMS::Queue::entry_info($entries[0]);
> print \$entryprop{"jobname"},
> foreach $prop (keys(%entryprop)) { printf "%s: %s\n", $prop,
> \$entryprop{$prop};}
>
> Which works fine in the first part (i.e. finds the correct
> queue entry for job
> BATSER), but does not give the properties of the job in
> part 2. Does
> anyone maybe have a working example using VMS::Queue to
> enlighten me?
>
> Thanks a lot, Martin
>
> P.S. OpenVMS Alpha 7.2.1, Perl 5.6.0, VMS::Queue 0.56
--
This message does not represent the policies or positions
of the Mayo Foundation or its subsidiaries.
Patrick Spinler email: [EMAIL PROTECTED]
Mayo Foundation phone: 507/284-9485
queuetest.pl
entrytest.pl
package Submitjob;
BEGIN {
use Exporter ();
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
# set the version for version checking
$VERSION = 1.00;
# if using RCS/CVS, this may be preferred
# must be all one line, for MakeMaker
$VERSION = do {my @r = (q$Revision: 1.00 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r,
@r};
@ISA = qw(Exporter);
@EXPORT = qw( );
%EXPORT_TAGS = ( ); # eg: TAG => [ qw!name1 name2! ],
# your exported package globals go here,
# as well as any optionally exported functions
@EXPORT_OK = qw( &submit_job &submit_and_wait );
}
use vars @EXPORT_OK;
# non-exported package globals go here
use vars qw($status);
use strict;
use diagnostics;
use English;
use File::Copy;
use POSIX qw( &cuserid &getpid );
use VMS::Priv;
use VMS::Stdio qw ( &tmpnam );
use VMS::Process qw( &process_list &get_all_proc_info_items );
use VMS::Filespec qw( &rmsexpand &vmsify &unixify );
use VMS::Queue qw( &queue_info &submit &entry_info &entry_bitmap_decode );
use File::Spec::VMS q( catfile catdir );
#==[ submit_job ]======================================================
#
# Submit a DCL string
#
# --- parameters ---
#
# String containing cmd file to submit (eg, my $cmd = q{$ write sys$output hi"};
# Optional string containing queue to submit to, SYS$BATCH if blank/empty
# Optional string containing name specification where command string
# will be written to
# Optional string containing log file specification
# Optional string containing user to submit job as
#
# --- return value ---
#
# Ref to entry_info() hash on success
# Throw a die() on failure
#
sub submit_job
{
my ($cmdstr, $queue, $cmdfilespec, $logfilespec, $user) = @_;
$queue = 'SYS$BATCH' if (!defined ($queue) || $queue eq '');
$cmdfilespec = &tmpnam() . ".com"
if (!defined $cmdfilespec || $cmdfilespec eq '');
$user = &cuserid() if (!defined $user || $user eq '');
$logfilespec = '' if (!defined $logfilespec);
if (cuserid() !~ m/$user/i)
{
my %privset;
tie (%privset, 'VMS::Priv');
$privset{"CMKRNL"} = 1;
die "Error $!:$^E setting needed privs" if (!defined $privset{"CMKRNL"});
}
print ("Submitting to $queue as $user with log $logfilespec\n");
print ("Commands in $cmdfilespec\n");
print ("----\n$cmdstr\n----\n");
my $entry =
{
"QUEUE" => $queue,
};
if ($user ne cuserid()) {$entry->{"USERNAME"} = $user;}
if ($logfilespec ne '')
{
$entry->{"LOG_SPECIFICATION"} = rmsexpand ($logfilespec);
$entry->{"NO_LOG_DELETE"} = 1;
$entry->{"NO_LOG_SPOOL"} = 1;
}
my $entryfile =
{
"FILE_SPECIFICATION" => $cmdfilespec,
};
open (OUTFILE, ">$cmdfilespec") || die ("Error $!:$^E opening $cmdfilespec");
print OUTFILE $cmdstr;
close OUTFILE;
my $entrynum = submit ($entry, $entryfile)
|| die ("Error $!:$^E submitting entry");
my $entryref = entry_info ($entrynum);
$entryref
}
#==[ submit_and_wait ]=================================================
#
# Submit a batch job, and wait for it to complete
#
#
# --- parameters ---
#
# String containing cmd file to submit (eg, my $cmd = q{$ write sys$output hi"};
# Optional string containing queue to submit to, SYS$BATCH if blank/empty
# Optional string containing name specification where command string
# will be written to
# Optional string containing log file specification
# Optional string containing user to submit job as
#
# --- return value ---
#
# none on success & job completion, throw a die() on error or job failure
#
sub submit_and_wait
{
# $" = ","; $, = ","; print "submit & wait ", @_, "\n";
my $entryinforef = submit_job (@_);
my $entrynum = $$entryinforef{'ENTRY_NUMBER'};
my $queue = $$entryinforef{'QUEUE_NAME'};
my $user = $$entryinforef{'USERNAME'};
my $jobpid = $$entryinforef{'JOB_PID'};
my $queueinforef = queue_info ($queue);
my $queuenode = $$queueinforef{'SCSNODE_NAME'};
my $entrystatusref =
entry_bitmap_decode ('JOB_STATUS', $$entryinforef{'JOB_STATUS'});
my %privset;
tie (%privset, 'VMS::Priv');
$privset{"SYSPRV"} = 1;
$privset{"WORLD"} = 1;
die "Error $!:$^E setting needed privs" if (!defined $privset{"WORLD"});
die "Error $!:$^E setting needed privs" if (!defined $privset{"SYSPRV"});
# foreach my $key (sort keys %$entrystatusref)
# {
# print " $key = $$entrystatusref{$key} \n";
# }
if ($jobpid == 0)
{
foreach my $key (sort keys %$entrystatusref)
{
printf " %s = %s\n", $key, $$entrystatusref{$key};
}
while ($$entrystatusref{'JOB_PENDING'} == 1 ||
$$entrystatusref{'JOB_STARTING'} == 1 ||
$$entrystatusref{'JOB_HOLDING'} == 1 ||
$$entrystatusref{'JOB_SUSPENDED'} == 1)
{
print "Sleeping waiting for job\n";
$entryinforef = entry_info ($entrynum);
$entrystatusref =
entry_bitmap_decode ('JOB_STATUS',
$$entryinforef{'JOB_STATUS'});
sleep 1;
}
$jobpid = $$entryinforef{'JOB_PID'};
}
eval
{
printf "Waiting for BATCH_$entrynum pid $jobpid, 0x%08x\n", $jobpid;
my $status = waitpid ($jobpid, 0);
};
$status = 1;
$entryinforef = entry_info ($entrynum);
if (defined $entryinforef)
{
print "Job still here !\n";
$entrystatusref =
entry_bitmap_decode ('JOB_STATUS',
$$entryinforef{'JOB_STATUS'}) ;
if ($$entrystatusref{'JOB_RETAINED'} == 1)
{
print "status = retained !\n";
$status = 0x14;
}
}
return $status;
}
1;