需求
- 一個后臺Java程序啟動時尺栖,可以在配置文件中配置線程數(shù)量。需要獲取線程數(shù)量和線程名進行校驗。
思路
- 讀取配置文件废境,獲得配置的線程數(shù)量。
- 獲取該java程序的進程pid
- 通過jstack 獲取該進程的線程詳情并重定向至文件
- python 讀取該文件并進行分析
實現(xiàn)
該java程序會將pid寫入一個文件中筒繁,所以直接讀取該文件獲得pid即可噩凹。此處將上述的2、3使用shell腳本實現(xiàn)毡咏。
#! /bin/bash
pid=`cat tpid`
jstack $pid >> ./$pid.txt
python 讀取該文件并進行分析
# -*- coding: utf-8 -*-
import re
import json
import subprocess
import sys
reload(sys)
sys.setdefaultencoding('utf8')
def get_real_threads_name_list(jstack_file): #從jstack log中獲取實際的線程數(shù)及線程名
log_file = open(jstack_file, 'r')
pattern = re.compile('"(.*)"')
real_threads_name_list = pattern.findall(log_file.read())
log_file.close()
print json.dumps(real_threads_name_list, encoding='utf-8', ensure_ascii=False)
return real_threads_name_list
def is_chinese(param_list): #判斷是否中文
real_threads_num = 0
for i in param_list:
if u'\u4e00' <= i <= u'\u9fff':
real_threads_num += 1
return real_threads_num
def get_application_threads_num(file_path): #從配置文件讀取配置的線程數(shù)量
application_yaml = open(file_path)
application_threads_num = 0
application = yaml.load(application_yaml)
if application['frms.etl.pay']['enable']:
application_threads_num += application['frms.etl.pay']['threadSize']
if application['frms.pay.auditobj']['enable']:
application_threads_num += application['frms.pay.auditobj']['threadsize']
if application['frms.pay.ds']['enable']:
application_threads_num += application['frms.pay.ds']['threadsize']
if application['frms.pay']['streamcube.publish.enable']:
application_threads_num += application['frms.pay']['dsobj']['threadsize']
if application['frms']['pay.etl']['cloud.call']:
application_threads_num += application['frms']['etl.data.service']['threadSize']
application_threads_num += application['frms.etl.scheduled.threadSize']
application_yaml.close()
return application_threads_num
def compare(a, b): #比較
if a == b:
print 'ok'
else:
print 'not ok'
if __name__ == '__main__':
subprocess.call('pid_log.sh', shell=True) #調(diào)用shell腳本
real_threads_nums = is_chinese(get_real_threads_name_list('H:\\scripts\\jstack19666.txt'))
application_threads_nums = get_application_threads_num(
'application(1).yml')
compare(real_threads_nums, application_threads_nums)
新需求
通過jstack遠程連接服務器
還沒實現(xiàn)