2012-10-02 3 views
0

일반적으로 Apache Tomcat은 shutdown.sh 스크립트 (또는 배치 파일)를 실행하여 종료합니다. 톰캣의 웹 컨테이너가 멀티 쓰레딩과 같은 미친 짓을하는 웹 애플리케이션을 호스팅 할 때, shutdown.sh을 실행하면 일부 톰캣이 정상적으로 종료됩니다 (시스템에 사용 가능한 메모리가 늘어남을 볼 수 있듯이). Tomcat 프로세스는 계속 실행됩니다. 내가하는 간단한 파이썬 스크립트를 작성하려고 해요Tomcat의 PID를 찾아 파이썬에서 죽이는 방법은 무엇입니까?

: kill -9 <PID> 을 가진 프로세스를 종료 해당되는 경우

  1. 통화가 shutdown.sh
  2. 실행합니다 ps -aef | grep tomcat 톰캣과 모든 프로세스를 찾을 수는
  3. 를 참조

    여기까지 가야합니다. (프로토 타입으로 - 저는 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() 
    

    내가 중간 부분과 사투를 벌인거야 - 적어도 한 결과가 항상 반환됩니다 크기는 항상 자체에 대한 참조를 반환 이상 1 (grep 이후 있는지 확인하면서 grep 결과를 얻기로, methinks)를 호출 한 다음 반환 된 PID를 구문 분석하여 killPidCmd에 전달합니다. 미리 감사드립니다!

답변

1

조작 할 수있는 문자열로 프로그램 출력을해야합니다. 그런 다음 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) 
+0

와우 - 대단한 대답, 감사합니다 @Ionut Hulub (+1)! 빠른 추적 - 일단'pid '를 얻으면'killPidCmd'에 어떻게 추가합니까? 'killPidCmd = "kill -9 $ pid'을 사용할 수 있습니까? 아니면 다른 것을 사용할 필요가 있습니까? – IAmYourFaja

+0

코드를 수정했습니다 –

+0

"kill -9 "다음에 공백을 잊지 마십시오 :) – Sandro

1

ps에 "c"를 추가하여 명령이 아닌 인수 만 인쇄 할 수 있습니다. 이것은 자기를 매치시키는 것을 멈출 것이다.

바람둥이가 Java 응용 프로그램으로 표시되는지 잘 모르겠으므로 작동하지 않을 수 있습니다.

추신 : "grep includes self"와 첫 번째 히트가 그 해결책을 가졌습니다.

편집 : 나쁘다! OK 이것 다음에 뭔가?

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! 

는 기본적으로 "밖으로"당신이 읽기/당신이 grepResults에 명령의 결과를 저장하려는 경우 grepResults = subprocess.check_output([grepCmd], shell=true)grepResults = subprocess.call([grepCmd], shell=true)를 교체해야

+0

팁 @Sandro (+1) 주셔서 감사합니다 - 그러나 내 질문에 대답하지 않습니다. grep에서 결과를 파싱하고 변수'pid'를 얻은 다음'killPidCmd'에'pid'를 전달하여 쉘에서 실행할 수있게하려고합니다. 모든 생각 - 그리고 다시 감사드립니다! – IAmYourFaja

+0

아, 죄송합니다. 문제를 이해하지 못해 죄송합니다. 내 수정 사항을 확인하십시오. – Sandro

+0

다시 한번 @Sandro - Ionut Hulub의 대답 아래에 내 의견을 볼 수 있습니까? 나는 당신에게 같은 질문을했습니다! – IAmYourFaja

0

만들기 자식 프로세스를 ps을 실행하고 문자열 grep로 출력과 일치 할 필요는 없습니다. 파이썬은 'baked in'이라는 훌륭한 문자열 처리 기능을 가지고 있으며, 리눅스는/proc에 필요한 모든 정보를 제공합니다. procfs 마운트는 명령 행 유틸리티가이 정보를 얻는 곳입니다. 소스로 직접 갈 수도 있습니다.

관련 문제