0

shutdown.sh通常、スクリプト(またはバッチファイル)を実行してApacheTomcatをシャットダウンします。TomcatのWebコンテナがマルチスレッドでいくつかのクレイジーなことを行うWebアプリをホストしている場合など、場合によっては、実行すると、Tomcatの一部shutdown.shが正常にシャットダウンされます(システムに返される利用可能なメモリが増えることがわかります)が、Tomcatプロセスは実行を続けます。

私は次のような単純なPythonスクリプトを書き込もうとしています。

  1. 呼び出しshutdown.sh
  2. ps -aef | grep tomcatTomcatが参照されているプロセスを検索するために実行されます
  3. 該当する場合は、kill -9 <PID>

これが私がこれまでに得たものです(プロトタイプとして-私は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()

私は真ん中の部分で苦労しています-grep結果を取得し、それらのサイズが1より大きいかどうかを確認し(grep常にそれ自体への参照を返すため、少なくとも1つの結果が常に返されます、メチンク)、返された結果を解析しますPIDとそれをに渡しkillPidCmdます。前もって感謝します!

4

3 に答える 3

1

psに「c」を追加して、引数ではなくコマンドのみが出力されるようにすることができます。これにより、グラブが自分自身と一致するのを防ぐことができます。

ただし、TomcatがJavaアプリケーションとして表示されるかどうかはわかりません。そのため、これは機能しない可能性があります。

PS:グーグルからこれを得ました:「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」は、読み取り/操作可能な文字列としてプログラム出力を持ちます

于 2012-10-02T02:27:12.770 に答える
1

コマンドの結果をgrepResultsに保存する場合はgrepResults = subprocess.call([grepCmd], shell=true)、に置き換える必要があります。grepResults = subprocess.check_output([grepCmd], shell=true)次に、splitを使用してそれを配列に変換でき、配列の2番目の要素は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)
于 2012-10-02T02:44:05.237 に答える
0

実行する子プロセスを作成し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)
于 2012-10-02T03:36:42.813 に答える