Tomcat Pid를 찾아 파이썬에서 그것을 죽이는 방법은 무엇입니까?
문제
일반적으로 shutdown.sh
스크립트 (또는 배치 파일)를 실행하여 Apache Tomcat을 종료합니다. 톰캣의 웹 컨테이너가 멀티 스레딩이있는 미친 것들을하는 웹 앱을 호스팅하는 경우와 같은 경우, Tomcat의 일부 부분을 정상적으로 종료합니다 (사용 가능한 메모리를 더 많이 볼 수 있듯이 시스템에) 그러나 Tomcat 프로세스가 계속 실행됩니다.
간단한 파이썬 스크립트를 작성하려고합니다.
-
shutdown.sh
를 호출합니다 - 는
shutdown.sh
를 실행하여 를 참조하여 tomcat가있는 프로세스를 찾습니다. - 해당하는 경우
ps -aef | grep tomcat
로 프로세스를 죽이십시오.여기에 지금까지 얻은 것입니다 (프로토 타입으로 - 나는 파이썬 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()
중간 부분으로 고생하고 있습니다 -
kill -9 <PID>
결과를 얻은 것으로, 크기가 1보다 큰지 확인하기 위해 (grep
가 항상 자체에 대한 참조를 반환하므로 최소한 1 개의 결과가 항상 반환됩니다), 그런 다음 반환 된 PID를 구문 분석하고grep
로 전달합니다. 미리 감사드립니다!
해결책
GrepResults에서 명령의 결과를 저장하려면 grepResults = subprocess.call([grepCmd], shell=true)
로 grepResults = subprocess.check_output([grepCmd], shell=true)
로 대체해야합니다.그런 다음 분할을 사용하여 배열로 변환하고 배열의 두 번째 요소가 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)
. 다른 팁
"C"를 PS에 추가 할 수 있으므로 인수가 인쇄되지 않도록 명령 만 사용할 수 있습니다.이것은 그 자아를 일치시키는 것을 막을 수 있습니다.
Tomcat가 Java 응용 프로그램으로 표시되는지 여부를 확실하지 않으므로 작동하지 않을 수 있습니다.
추신 : Googling에서 이것을 얻었습니다. "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"은 프로그램 출력을 읽거나 조작 할 수있는 문자열로 출력합니다
ps
및 String을 실행하는 하위 프로세스 생성 grep
와의 출력과 일치하는 것은 필요하지 않습니다.파이썬에는 'Baked in'및 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)
.