ruoyunbai 2bb9621e30 1
2021-09-29 21:06:16 +08:00

179 lines
4.2 KiB
Perl

#!/usr/bin/perl
#
# qpeek: Peek into a job's output spool files
# Copyright 2001, 2006, 2007, 2016 Ohio Supercomputer Center
# Copyright 2008, 2010 Adaptive Computing
#
# License: GNU GPL v2; see ../COPYING for details.
# Revision info:
# $HeadURL$
# $Revision$
# $Date$
#
# Usage: qpeek [options] JOBID
#
# Options:
# -c Show all of the output file ("cat", default)
# -h Show only the beginning of the output file ("head")
# -t Show only the end of the output file ("tail")
# -f Show only the end of the file and keep listening ("tail -f")
# -e Show the stderr file of the job
# -o Show the stdout file of the job
#
# -ssh Use the ssh command to remote access the mother superior node
# -rsh Use the rsh command to remote access the mother superior node
# -spool=<spool_loc> Specify the location of the spool directory, defaults to /opt/torque
# -host=<host> The name of the host to use in the filename for the jobs stdout or stderr
#
# -help|? Display help message
use strict;
use warnings;
use Getopt::Long qw(:config bundling);
MAIN:
{
# Options Variables
my $tool = "cat";
my $rsh_cmd = "rsh";
my $help = 0;
my $o = 0;
my $e = 0;
my $host_in_jobid = 1;
my $spool;
my $host;
GetOptions(
'c' => sub { $tool = "cat" },
'f' => sub { $tool = "tail -f" },
'h' => sub { $tool = "head" },
't' => sub { $tool = "tail" },
'e' => \$e,
'o' => \$o,
'ssh' => sub { $rsh_cmd = "ssh" },
'rsh' => sub { $rsh_cmd = "rsh" },
'spooldir|spool=s' => \$spool,
'host=s' => \$host,
'help|?' => \$help,
);
if ( !defined($spool) && defined($ENV{'PBS_HOME'}) )
{
$spool = $ENV{'PBS_HOME'};
}
elsif ( !defined($spool) )
{
$spool = "/opt/torque";
}
if ( !defined($host) && -r "$spool/server_name" )
{
$host = `cat $spool/server_name`;
chomp($host);
}
elsif ( !defined($host) )
{
$host = "set_the_host";
}
# Set OU as the default spool suffix
$o = 1
unless ($o or $e);
# Print help
printHelp()
if $help;
# Get the job id
my $jobid = shift(@ARGV) || die "No job id given!";
$jobid =~ s/\.[A-z0-9.]+$//;
die "No jobid given!\n"
if ($jobid eq "");
# Get the mother superior node
my $node = &motherSuperior($jobid);
die "Job $jobid is not running!\n"
if ($node eq "");
# Format and run the command
my $cmd = "$rsh_cmd $node $tool";
if ( $host_in_jobid==1 )
{
$cmd .= " $spool/spool/$jobid.$host.OU"
if $o;
$cmd .= " $spool/spool/$jobid.$host.ER"
if $e;
}
else
{
$cmd .= " $spool/spool/$jobid.OU"
if $o;
$cmd .= " $spool/spool/$jobid.ER"
if $e;
}
$cmd .= "\n";
exec $cmd;
exit 0;
} # END MAIN
#------------------------------------------------------------------------------
# printHelp
#------------------------------------------------------------------------------
sub printHelp #()
{
print STDERR <<EOF;
Usage: qpeek [options] JOBID
Options:
-c Show all of the output file ("cat", default)
-h Show only the beginning of the output file ("head")
-t Show only the end of the output file ("tail")
-f Show only the end of the file and keep listening ("tail -f")
-e Show the stderr file of the job
-o Show the stdout file of the job
-ssh Use the ssh command rather than rsh to remote access the mother superior node
-spool=<spool_loc> Specifiy the location of the spool directory, defaults to /opt/torque
-host=<host> The name of the host to use in the filename for the jobs stdout or stderr
-help|? Display help message
EOF
exit 0;
} # END sub printHelp #()
#------------------------------------------------------------------------------
# motherSuperior
#------------------------------------------------------------------------------
sub motherSuperior #($)
{
my $jobid;
my $node;
my $keyword;
$jobid = $_[0];
$node = "";
open(QSTAT, "qstat -f $jobid |");
while (<QSTAT>)
{
chop;
if ($_ =~ /exec_host/)
{
($keyword, $node) = split(/=/);
$node =~ s:/[0-9]+[A-z0-9/+]*::;
}
}
return $node;
} # END sub motherSuperior #($)