Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何找到Tomcat';用python杀死PID?_Python_Tomcat_Grep_Pid_Sigkill - Fatal编程技术网

如何找到Tomcat';用python杀死PID?

如何找到Tomcat';用python杀死PID?,python,tomcat,grep,pid,sigkill,Python,Tomcat,Grep,Pid,Sigkill,通常,通过运行ApacheTomcat的shutdown.sh脚本(或批处理文件)关闭ApacheTomcat。在某些情况下,例如当Tomcat的web容器承载一个web应用程序,该应用程序通过多线程执行一些疯狂的操作时,运行shutdown.sh会优雅地关闭Tomcat的某些部分(因为我可以看到更多可用内存返回到系统),但Tomcat进程仍在运行 我正在尝试编写一个简单的Python脚本: 调用shutdown.sh 运行ps-aef | grep tomcat查找引用了tomcat的任何进程

通常,通过运行ApacheTomcat的
shutdown.sh
脚本(或批处理文件)关闭ApacheTomcat。在某些情况下,例如当Tomcat的web容器承载一个web应用程序,该应用程序通过多线程执行一些疯狂的操作时,运行
shutdown.sh
会优雅地关闭Tomcat的某些部分(因为我可以看到更多可用内存返回到系统),但Tomcat进程仍在运行

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

  • 调用
    shutdown.sh
  • 运行
    ps-aef | grep tomcat
    查找引用了tomcat的任何进程
  • 如果适用,使用
    kill-9
  • 以下是我到目前为止得到的(作为一个原型-我对Python是全新的,顺便说一句):

    我正在努力解决中间部分的问题——获取
    grep
    结果,检查它们的大小是否大于1(因为
    grep
    总是返回对自身的引用,我认为至少会返回一个结果),然后解析返回的PID并将其传递到
    killPidCmd
    。提前谢谢

    您可以将“c”添加到ps,以便只打印命令而不打印参数。这将阻止grab与其自身匹配

    但我不确定tomcat是否显示为java应用程序,因此这可能不起作用

    PS:这是从谷歌搜索得到的:“grep包括self”,第一次点击就有了这个解决方案

    编辑:我的错!好吧,那就这样吧

    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!
    
    p=subprocess.Popen([“ps-caux | grep-tomcat”],shell=True,stdout=subprocess.PIPE)
    out,err=p.communicate()
    
    out.split()。然后可以使用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)
    

    不需要创建子进程来运行
    ps
    并将输出与
    grep
    进行字符串匹配。Python具有出色的字符串处理能力,Linux在/proc中公开了所有需要的信息。procfs挂载是命令行实用程序获取此信息的地方。也可以直接找到源头

    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)
    

    谢谢你的提示@Sandro(+1)-但是这并不能回答我的问题。我正试图解析来自grep的结果,使用它获得一个变量
    pid
    ,然后将
    pid
    传递到
    killPidCmd
    中,以便它可以在shell上执行。有什么想法吗?再次感谢!啊,好的,很抱歉我不理解这个问题,请检查我的编辑。再次感谢@Sandro-你能看看我在Ionut Hulub的答案下面的评论吗?我有同样的问题要问你!“kill-9”+str(pid)--或--(“kill-9%d”%pid)都可以完成此任务!哇-回答得很好,谢谢@Ionut Hulub(+1)!快速跟进-一旦获得
    pid
    ,如何将其添加到
    killPidCmd
    ?我可以只使用
    killPidCmd=“kill-9$pid
    还是需要使用其他东西?再次感谢!不要忘记“kill-9”后面的空格:
    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)