1.介绍
实现环境:Windows7+Python2.7
开发背景:在测试服务器上实现tomcat(apache-tomcat-8.0.29)下包的自动升级;该服务器除tomcat外,无其他服务依赖java;包升级前,需要确认tomcat启动;在包升级后,需要重启tomcat;脚本在测试服务器上,可直接运行的Python代码;
实现原理:
终止tomcat进程,如果系统只有一个tomcat在运行,没其他的Java程序在跑的话,终结java进程可快速关掉Tomcat进程;
准备工作:
通过以下命令获取到进程列表,而其中java.exe为tomcat已启动标志:
tasklist
当然也可以通过查找tomcat占用的端口(默认8080)进程来查找:
netstat -ano | findstr 8080
Windows下关闭tomcat,可以直接终结java.exe,CMD中可以直接执行以下命令:
taskkill /F /IM java.exe
也可以通过终结进程号(例如:1234)来关闭:
taskkill /F /PID 1234
2.代码实现
#! /usr/bin/env python
# coding=utf-8
import os
import time
import subprocess
import sys
import re
import os
reload(sys)
sys.setdefaultencoding('utf-8')
if __name__ == '__main__':
#命令行
cmd_tasklist = "tasklist"
cmd_taskkill_java = "taskkill /F /IM java.exe"
#查找java.exe
p_srch_java = subprocess.Popen(cmd_tasklist, shell=True, stdout=subprocess.PIPE)
lines = p_srch_java.stdout.readlines()
flag_tomcat_status = 0
for line in lines:
if re.search("java.exe",line):
print('已启动tomcat').decode('UTF-8').encode('GBK')
flag_tomcat_status = 1
p_srch_java.kill()
# 如果没有tomcat没有启动,在升级之前,启动tomcat
if flag_tomcat_status == 0:
print('升级前tomcat未启动,先启动tomcat').decode('UTF-8').encode('GBK')
#subprocess.call(cmd_tomcat_startup)
os.chdir(r"D:\apache-tomcat-8.0.29\bin")
os.system(".\startup.bat")
time.sleep(10)
#升级过程代码省略
#重启tomcat
p_srch_tomcat = subprocess.Popen(cmd_tasklist, shell=True, stdout=subprocess.PIPE)
lines = p_srch_tomcat.stdout.readlines()
for line in lines:
if re.search("java.exe",line):
print('重启tomcat-步骤1停止java.exe').decode('UTF-8').encode('GBK')
p_taskkill_java = subprocess.Popen(cmd_taskkill_java, shell=True, stdout=subprocess.PIPE)
p_taskkill_java.wait()
time.sleep(5)
print('重启tomcat-步骤2启动tomcat').decode('UTF-8').encode('GBK')
#subprocess.call(cmd_tomcat_startup)
os.chdir(r"D:\apache-tomcat-8.0.29\bin")
os.system(".\startup.bat")
p_srch_tomcat.kill()
在用Python的subprocess.Popen调用startup.bat命令的过程中,遇到很多问题后,以上为转向使用os.system调用的部分;经过学习后,subprocess.Popen可以如下方式实现:
pt = subprocess.Popen( "D:\\apache-tomcat-8.0.29\\bin\\startup.bat",stdout=subprocess.PIPE)
pt.wait()
for i in range(5):
print pt.stdout.readline().strip('\n')
3.问题处理
The CATALINA_HOME environment variable is not defined correctly
This environment variable is needed to run this program
第一步鼠标右键计算机->属性->高级系统设置,进去之后,点击环境变量;
第二步开始配置tomcat的环境变量,新建系统变量名CATALINA_BASE,值为tomcat的安装路径;
第三步新建系统变量CATALINA_HOME,值为tomcat的安装路径;
第四步找到系统变量path,在值里面添加“%CATALINA_HOME%\lib;%CATALINA_HOME%\bin”;
第五步点击确定,保存系统变量的配置之后,按win+R键打开运行,输入cmd,点击确定,在命令行中输入“startup”,启动tomcat服务,启动成功代表环境变量配置成功;