TomcatのPIDを見つけてpythonで強制終了するにはどうすればよいですか?
質問
通常、Apache Tomcatをシャットダウンするには、次のコマンドを実行します shutdown.sh
スクリプト(またはバッチファイル)。いくつかのケースでは、Tomcatのwebコンテナがマルチスレッドでいくつかの狂ったことを行うwebアプリをホストしているときなど、実行しています shutdown.sh
優雅にシャットダウン いくつか Tomcatの一部(より多くの利用可能なメモリがシステムに戻るのを見ることができるように)が、Tomcatプロセスは実行され続けます。
私は単純なPythonスクリプトを書こうとしています:
- コール
shutdown.sh
- 走る
ps -aef | grep tomcat
Tomcatが参照されているプロセスを見つけるには - 該当する場合は、プロセスを強制終了します
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つの結果が常に返されます。methinks)、その後、返されたPIDを解析し、それを渡します。 killPidCmd
.事前に感謝!
解決
あなたは交換する必要があります grepResults = subprocess.call([grepCmd], shell=true)
と grepResults = subprocess.check_output([grepCmd], shell=true)
コマンドの結果をgrepResultsに保存する場合。次に、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)
他のヒント
Psに"c"を追加して、引数ではなくコマンドのみが出力されるようにすることができます。これはグラブがその自己と一致するのを止めるでしょう。
Tomcatがjavaアプリケーションとして表示されるかどうかはわかりませんが、これは機能しない可能性があります。
PS:グーグルからこれを得た:"grep includes 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!
基本的に"out"は、プログラムを読み取り/操作できる文字列として出力します
実行する子プロセスの作成 ps
そして、文字列は出力と一致します grep
必要ではありません。Pythonには'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)