문제

일반적으로 shutdown.sh 스크립트 (또는 배치 파일)를 실행하여 Apache Tomcat을 종료합니다. 톰캣의 웹 컨테이너가 멀티 스레딩이있는 미친 것들을하는 웹 앱을 호스팅하는 경우와 같은 경우, Tomcat의 일부 부분을 정상적으로 종료합니다 (사용 가능한 메모리를 더 많이 볼 수 있듯이 시스템에) 그러나 Tomcat 프로세스가 계속 실행됩니다.

간단한 파이썬 스크립트를 작성하려고합니다.

  1. shutdown.sh 를 호출합니다
  2. shutdown.sh를 실행하여 를 참조하여 tomcat가있는 프로세스를 찾습니다.
  3. 해당하는 경우 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)
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top