通常,通过运行其shutdown.sh
脚本(或批处理文件)来关闭Apache Tomcat。在某些情况下,例如当Tomcat的Web容器托管一个使用多线程执行某些疯狂操作的Web应用程序时,运行shutdown.sh
可以正常关闭 Tomcat的某些部分(我可以看到)更多可用内存返回系统),但Tomcat进程仍在运行。
我正在尝试编写一个简单的Python脚本:
shutdown.sh
ps -aef | grep tomcat
以查找引用Tomcat的任何进程kill -9 <PID>
这是我到目前为止所做的(作为原型 - 我是Python BTW的新手):
#!/usr/bin/python
# Imports
import sys
import subprocess
# Load from imported module.
if __init__ == "__main__":
main()
# Main entry point.
def main():
# Shutdown Tomcat
shutdownCmd = "sh ${TOMCAT_HOME}/bin/shutdown.sh"
subprocess.call([shutdownCmd], shell=true)
# Check for PID
grepCmd = "ps -aef | grep tomcat"
grepResults = subprocess.call([grepCmd], shell=true)
if(grepResult.length > 1):
# Get PID and kill it.
pid = ???
killPidCmd = "kill -9 $pid"
subprocess.call([killPidCmd], shell=true)
# Exit.
sys.exit()
我正在努力争取中间部分 - 获取grep
结果,检查他们的大小是否大于1(因为grep
总是返回对自身的引用,至少1个结果将始终返回,methinks),然后解析返回的PID并将其传递给killPidCmd
。提前谢谢!
答案 0 :(得分:1)
您可以在ps中添加“c”,以便只打印命令而不打印参数。这会阻止抓住自己的匹配。
我不确定tomcat是否显示为java应用程序,所以这可能不起作用。
PS:通过谷歌搜索得到了这个:“grep包括自我”,第一次点击有解决方案。 编辑:我的坏!那么好吗?p = subprocess.Popen(["ps caux | grep tomcat"], shell=True,stdout=subprocess.PIPE)
out, err = p.communicate()
out.split()[1] #<-- checkout the contents of this variable, it'll have your pid!
基本上“out”会将程序输出作为可以读取/操作的字符串
答案 1 :(得分:1)
如果要在grepResults中保存命令的结果,则需要将grepResults = subprocess.call([grepCmd], shell=true)
替换为grepResults = subprocess.check_output([grepCmd], shell=true)
。然后你可以使用split将它转换为数组,数组的第二个元素将是pid:pid = int(grepResults.split()[1])'
然而,这只会杀死第一个进程。如果多个进程打开,它不会终止所有进程。为了做到这一点,你必须写:
grepResults = subprocess.check_output([grepCmd], shell=true).split()
for i in range(1, len(grepResults), 9):
pid = grepResults[i]
killPidCmd = "kill -9 " + pid
subprocess.call([killPidCmd], shell=true)
答案 2 :(得分:0)
创建子进程以运行ps
并将输出与grep
匹配的字符串不是必需的。 Python有很好的字符串处理'烘焙',而Linux暴露了/ proc中所有需要的信息。 procfs mount是命令行实用程序获取此信息的位置。不妨直接去源头。
import os
SIGTERM = 15
def pidof(image):
matching_proc_images = []
for pid in [dir for dir in os.listdir('/proc') if dir.isdigit()]:
lines = open('/proc/%s/status' % pid, 'r').readlines()
for line in lines:
if line.startswith('Name:'):
name = line.split(':', 1)[1].strip()
if name == image:
matching_proc_images.append(int(pid))
return matching_proc_images
for pid in pidof('tomcat'): os.kill(pid, SIGTERM)