{"id":3468,"date":"2014-08-21T09:18:43","date_gmt":"2014-08-21T01:18:43","guid":{"rendered":"http:\/\/rmohan.com\/?p=3468"},"modified":"2014-08-21T09:29:28","modified_gmt":"2014-08-21T01:29:28","slug":"get-the-java-info-perl","status":"publish","type":"post","link":"https:\/\/mohan.sg\/?p=3468","title":{"rendered":"Get the java info perl"},"content":{"rendered":"<pre style=\"color: #000000;\">#!\/usr\/bin\/perl\r\n\r\n# Fast script to grab jstack \/ jinfo and jmap of processes running on server.\r\n#\r\n\r\n### Update paths here for java_base.\r\n$java_base='\/usr\/java\/bin';\r\n$jstack='jstack';\r\n$jinfo='jinfo';\r\n$jmap='jmap';\r\n$script=$0;\r\n$runuser=`\/usr\/xpg4\/bin\/id -nu`;\r\nchomp($runuser);\r\n#$outdir='\/tmp';\r\n($min, $hour, $day, $month, $year) = (localtime)[1,2,3,4,5];\r\n$year=$year+1900;\r\nif ( $month &lt; 10 ) { $month=\"0$month\"; }\r\nif ( $day &lt; 10 ) { $day=\"0$day\"; }\r\nif ( $hour &lt; 10 ) { $hour=\"0$hour\"; }\r\nif ( $min &lt; 10 ) { $min=\"0$min\"; }\r\n\r\n$tarfile=\"$script-$year$month$day-$hour$min.tar\";\r\n\r\nsub options\r\n{\r\n        use Getopt::Long;\r\n        if ($#ARGV lt 0)\r\n        {\r\n                &amp;usage;\r\n        }\r\n        GetOptions (\"debug|d\"           =&gt; \\$debug,\r\n                    \"verbose|v\"         =&gt; \\$verbose,\r\n                    \"quiet|q\"           =&gt; \\$quiet,\r\n                    \"outdir=s\"          =&gt; \\$outdir,\r\n                    \"o=s\"               =&gt; \\$outdir,\r\n                    \"remove|r\"          =&gt; \\$remove,\r\n                    \"help|h\"              =&gt; \\$help);\r\n        &amp;usage if $help;\r\n}\r\n\r\n# sub routine to print out the usage if the no command line arguments are passed.\r\nsub usage\r\n{\r\n        print \"This script will generate jstack \/ jinfo and jmap of all java processes on the server that are currently running\\n\";\r\n        print \"It will create a tar file of all output.\\n\";\r\n        print \"Optionally, the script will remove the output directory\\n\";\r\n        print \"\\n\";\r\n        print \"-outdir or -o: Specify an output directory for the traces.\\n\";\r\n        print \"-remove or -r: Remove the output directory after creating the tar file.\\n\";\r\n        print \"-debug or -d: Debug Output.\\n\";\r\n        print \"-verbose or -v: Verbose Output.\\n\";\r\n        print \"-help or -h: Help message.\\n\";\r\n        print \"\\n\";\r\n        print \"Example Usage:\\n\";\r\n        print \"\\t$script -o foo -v\\n\";\r\n\r\n        exit 1;\r\n}\r\n\r\n&amp;options;\r\n\r\nif ( $runuser ne \"root\" )\r\n{\r\n        print \"You need to be root to use this tool\\n\";\r\n        exit 1;\r\n}\r\n\r\nif ( ! $outdir )\r\n{\r\n        print \"Output directory is required\\n\";\r\n        exit 2;\r\n}\r\nelse\r\n{\r\n        if ( -d $outdir )\r\n        {\r\n                print \"Output directory $outdir already exists - exiting\\n\";\r\n                exit 3;\r\n        }\r\n        if ( ! -d $outdir )\r\n        {\r\n                system(\"mkdir $outdir\");\r\n        }\r\n        if ( $verbose )\r\n        {\r\n                print \"Created $outdir\\n\";\r\n        }\r\n        if ( $debug )\r\n        {\r\n                print \"DEBUG: mkdir $outdir\\n\";\r\n        }\r\n\r\n        system(\"\/usr\/bin\/logger -p local0.info \\\"$script : invoked by $runuser \\\"\");\r\n\r\n        @jps=`$java_base\/jps | grep -v Jps`;\r\n\r\n        foreach (@jps)\r\n        {\r\n                ($pid,$name)=split(\/ \/, $_);\r\n                chomp ($name);\r\n                if ( $debug )\r\n                {\r\n                        print \"DEBUG: pid: $pid\\n\";\r\n                        print \"DEBUG: name: $name\\n\";\r\n                }\r\n                $is_64_bit=`$java_base\/$jstack $pid 2&gt;&amp;1 | grep -c 'debuggee is 64 bit'`;\r\n                if ( $is_64_bit == 1 ) # we need to use 64 bit option here.\r\n                {\r\n                        $proc_bits=64;\r\n                }\r\n                else\r\n                {\r\n                        $proc_bits=32;\r\n                }\r\n                if ( $debug )\r\n                {\r\n                        print \"DEBUG: $java_base\/$jstack -d$proc_bits $pid 2&gt;&amp;1 &gt; $outdir\/jstack.$name.wri\\n\";\r\n                }\r\n                $cmd=`$java_base\/$jstack -d$proc_bits $pid 2&gt;&amp;1 &gt; $outdir\/jstack.$name.wri`;\r\n                if ( $verbose )\r\n                {\r\n                        print \"Creating stack trace for $name\\n\";\r\n                }\r\n\r\n\r\n                if ( $debug )\r\n                {\r\n                        print \"DEBUG: $java_base\/$jinfo -d$proc_bits $pid 2&gt;&amp;1 &gt; $outdir\/jinfo.$name.wri\\n\";\r\n                }\r\n                $cmd=`$java_base\/$jinfo -d$proc_bits $pid 2&gt;&amp;1 &gt; $outdir\/jinfo.$name.wri`;\r\n                if ( $verbose )\r\n                {\r\n                        print \"Creating info trace for $name\\n\";\r\n                }\r\n\r\n                if ( $debug )\r\n                {\r\n                        print \"DEBUG: $java_base\/$jmap -d$proc_bits $pid 2&gt;&amp;1 &gt; $outdir\/jmap.$name.wri\\n\";\r\n                }\r\n                $cmd=`$java_base\/$jmap -d$proc_bits $pid 2&gt;&amp;1 &gt; $outdir\/jmap.$name.wri`;\r\n                if ( $verbose )\r\n                {\r\n                        print \"Creating jmap trace for $name\\n\";\r\n                }\r\n        } # end foreach\r\n        $cmd=`tar cvf $tarfile $outdir`;\r\n        $cmd=`gzip $tarfile`;\r\n        if ( $remove )\r\n        {\r\n                $cmd=`rm -rf $outdir`;\r\n                if ( $verbose )\r\n                {\r\n                        print \"Removing directory $outdir\\n\";\r\n                }\r\n                if ( $debug )\r\n                {\r\n                        print \"DEBUG: rm -rf $outdir\\n\";\r\n                }\r\n        }\r\n} # end else.\r\n\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>#!\/usr\/bin\/perl # Fast script to grab jstack \/ jinfo and jmap of processes running on server. # ### Update paths here for java_base. $java_base=&#8217;\/usr\/java\/bin&#8217;; $jstack=&#8217;jstack&#8217;; $jinfo=&#8217;jinfo&#8217;; $jmap=&#8217;jmap&#8217;; $script=$0; $runuser=`\/usr\/xpg4\/bin\/id -nu`; chomp($runuser); #$outdir=&#8217;\/tmp&#8217;; ($min, $hour, $day, $month, $year) = (localtime)[1,2,3,4,5]; $year=$year+1900; if ( $month &lt; 10 ) { $month=&#8221;0$month&#8221;; } if ( $day &lt; 10 ) [&#8230;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[64],"tags":[],"_links":{"self":[{"href":"https:\/\/mohan.sg\/index.php?rest_route=\/wp\/v2\/posts\/3468"}],"collection":[{"href":"https:\/\/mohan.sg\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mohan.sg\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mohan.sg\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mohan.sg\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3468"}],"version-history":[{"count":2,"href":"https:\/\/mohan.sg\/index.php?rest_route=\/wp\/v2\/posts\/3468\/revisions"}],"predecessor-version":[{"id":3471,"href":"https:\/\/mohan.sg\/index.php?rest_route=\/wp\/v2\/posts\/3468\/revisions\/3471"}],"wp:attachment":[{"href":"https:\/\/mohan.sg\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3468"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mohan.sg\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3468"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mohan.sg\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3468"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}