将java的堆栈信息输出到文件的python脚本

把java的堆栈信息保存起来,可以方便排查问题。

这个脚本是把之前的优化了一下,方便管理。

给脚本传一个参数进去,参数是可以唯一标识java进程的一个关键字,脚本里也包括了清理堆栈文件的内容

以glassfish为例,写个任务计划

*/1 * * * * /usr/local/bin/thread_dump.py domain1

每分钟输出一次domain1的堆栈信息到文件。

脚本如下

#!/usr/bin/python

import commands
import os
import sys
import string
import datetime

def main():

    if len(sys.argv) == 1:
        print "Missing Operand..."
        return

    dumpdir = "/usr/local/thread_dump/"
    if os.path.exists(dumpdir) == False:
        os.makedirs(dumpdir)
    if os.path.exists(dumpdir + '__bak') == False:
        os.makedirs(dumpdir + '__bak')

    getpid = "ps -ef|grep " + sys.argv[1] + "|grep -v -E 'grep|more|tail|thread_dump'|awk '{print $2}'"
    pid = os.popen(getpid).read().rstrip()
    if pid != "":
        dumpThread(pid)
    else:
       print "Can't find " + sys.argv[1] + " Process"

    cleardump = "/usr/bin/find " + dumpdir + " -maxdepth 1 -mmin +30 -name '*dump*.txt' -exec mv {} " + dumpdir + "/__bak \;&&/usr/bin/find " + dumpdir + "__bak -maxdepth 1 -mtime +3 -name '*dump*.txt' -exec rm {} \;"
    os.system(cleardump)

def dumpThread(pid):

    try:
        filename = dumpdir + sys.argv[1] + "_dump_"+ datetime.datetime.strftime(datetime.datetime.today(),'%y%m%d_%H%M')+".txt"
        dump = "/bin/su - anyuser -c \'/usr/local/jdk/bin/jstack " + pid + " > " + filename + "\'"
        os.system(dump)
        print filename+" has been created!"
    except Exception, ex:
        print str(ex)
        pass

main()

 


			

发表评论

电子邮件地址不会被公开。 必填项已用*标注