如何找到Tomcat PID并在python中杀死它?

时间:2012-10-02 02:23:11

标签: python tomcat grep pid sigkill

通常,通过运行其shutdown.sh脚本(或批处理文件)来关闭Apache Tomcat。在某些情况下,例如当Tomcat的Web容器托管一个使用多线程执行某些疯狂操作的Web应用程序时,运行shutdown.sh可以正常关闭 Tomcat的某些部分(我可以看到)更多可用内存返回系统),但Tomcat进程仍在运行。

我正在尝试编写一个简单的Python脚本:

  1. 致电shutdown.sh
  2. 运行ps -aef | grep tomcat以查找引用Tomcat的任何进程
  3. 如果适用,请使用kill -9 <PID>
  4. 终止该过程

    这是我到目前为止所做的(作为原型 - 我是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。提前谢谢!

3 个答案:

答案 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)