#!/usr/bin/perl # Fast script to grab jstack / jinfo and jmap of processes running on server. # ### Update paths here for java_base. $java_base='/usr/java/bin'; $jstack='jstack'; $jinfo='jinfo'; $jmap='jmap'; $script=$0; $runuser=`/usr/xpg4/bin/id -nu`; chomp($runuser); #$outdir='/tmp'; ($min, $hour, $day, $month, $year) = (localtime)[1,2,3,4,5]; $year=$year+1900; if ( $month < 10 ) { $month="0$month"; } if ( $day < 10 ) { $day="0$day"; } if ( $hour < 10 ) { $hour="0$hour"; } if ( $min < 10 ) { $min="0$min"; } $tarfile="$script-$year$month$day-$hour$min.tar"; sub options { use Getopt::Long; if ($#ARGV lt 0) { &usage; } GetOptions ("debug|d" => \$debug, "verbose|v" => \$verbose, "quiet|q" => \$quiet, "outdir=s" => \$outdir, "o=s" => \$outdir, "remove|r" => \$remove, "help|h" => \$help); &usage if $help; } # sub routine to print out the usage if the no command line arguments are passed. sub usage { print "This script will generate jstack / jinfo and jmap of all java processes on the server that are currently running\n"; print "It will create a tar file of all output.\n"; print "Optionally, the script will remove the output directory\n"; print "\n"; print "-outdir or -o: Specify an output directory for the traces.\n"; print "-remove or -r: Remove the output directory after creating the tar file.\n"; print "-debug or -d: Debug Output.\n"; print "-verbose or -v: Verbose Output.\n"; print "-help or -h: Help message.\n"; print "\n"; print "Example Usage:\n"; print "\t$script -o foo -v\n"; exit 1; } &options; if ( $runuser ne "root" ) { print "You need to be root to use this tool\n"; exit 1; } if ( ! $outdir ) { print "Output directory is required\n"; exit 2; } else { if ( -d $outdir ) { print "Output directory $outdir already exists - exiting\n"; exit 3; } if ( ! -d $outdir ) { system("mkdir $outdir"); } if ( $verbose ) { print "Created $outdir\n"; } if ( $debug ) { print "DEBUG: mkdir $outdir\n"; } system("/usr/bin/logger -p local0.info \"$script : invoked by $runuser \""); @jps=`$java_base/jps | grep -v Jps`; foreach (@jps) { ($pid,$name)=split(/ /, $_); chomp ($name); if ( $debug ) { print "DEBUG: pid: $pid\n"; print "DEBUG: name: $name\n"; } $is_64_bit=`$java_base/$jstack $pid 2>&1 | grep -c 'debuggee is 64 bit'`; if ( $is_64_bit == 1 ) # we need to use 64 bit option here. { $proc_bits=64; } else { $proc_bits=32; } if ( $debug ) { print "DEBUG: $java_base/$jstack -d$proc_bits $pid 2>&1 > $outdir/jstack.$name.wri\n"; } $cmd=`$java_base/$jstack -d$proc_bits $pid 2>&1 > $outdir/jstack.$name.wri`; if ( $verbose ) { print "Creating stack trace for $name\n"; } if ( $debug ) { print "DEBUG: $java_base/$jinfo -d$proc_bits $pid 2>&1 > $outdir/jinfo.$name.wri\n"; } $cmd=`$java_base/$jinfo -d$proc_bits $pid 2>&1 > $outdir/jinfo.$name.wri`; if ( $verbose ) { print "Creating info trace for $name\n"; } if ( $debug ) { print "DEBUG: $java_base/$jmap -d$proc_bits $pid 2>&1 > $outdir/jmap.$name.wri\n"; } $cmd=`$java_base/$jmap -d$proc_bits $pid 2>&1 > $outdir/jmap.$name.wri`; if ( $verbose ) { print "Creating jmap trace for $name\n"; } } # end foreach $cmd=`tar cvf $tarfile $outdir`; $cmd=`gzip $tarfile`; if ( $remove ) { $cmd=`rm -rf $outdir`; if ( $verbose ) { print "Removing directory $outdir\n"; } if ( $debug ) { print "DEBUG: rm -rf $outdir\n"; } } } # end else.
Recent Comments