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