1

Pythonスクリプトgrepで特定のプロセスを実行し、そのPIDを抽出して、強制終了する必要があります。これが私が使用しているものです:

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.check_output([grepCmd], shell=True)

    # Get PID(s) and kill it/them.
    for i in range(1, len(grepResults), 9):
    pid = grepResults[i]
    killPidCmd = "kill -9 " + pid
    subprocess.call([killPidCmd], shell=True)

    # Exit.
    sys.exit()

ただし、プロセス(Apache Tomcat)はシャットダウンしますが、実行するたびにターミナルに次の「警告」が表示されます。

kill -l [exitstatus]
/bin/sh: 1: kill: Operation not permitted

/bin/sh: 1: kill: Illegal number: h
/bin/sh: 1: kill: Illegal number: v
/bin/sh: 1: kill: Illegal number: l
/bin/sh: 1: kill: Operation not permitted

/bin/sh: 1: kill: Illegal number: .
/bin/sh: 1: kill: Illegal number: i
/bin/sh: 1: kill: Illegal number: D
/bin/sh: 1: kill: Illegal number: l
/bin/sh: 1: kill: Illegal number: .
/bin/sh: 1: kill: Illegal number: i
/bin/sh: 1: kill: Illegal number: /
/bin/sh: 1: kill: Illegal number: s
/bin/sh: 1: kill: Illegal number: r
/bin/sh: 1: kill: Illegal number: /
/bin/sh: 1: kill: Illegal number: .
/bin/sh: 1: kill: Illegal number: c
/bin/sh: 1: kill: Illegal number: t
/bin/sh: 1: kill: Illegal number: c
/bin/sh: 1: kill: Illegal number: i
/bin/sh: 1: kill: Illegal number: r
/bin/sh: 1: kill: Illegal number: a
/bin/sh: 1: kill: Illegal number: l
/bin/sh: 1: kill: Illegal number: a
/bin/sh: 1: kill: Illegal number: g
/bin/sh: 1: kill: Illegal number: j
/bin/sh: 1: kill: Illegal number: s
/bin/sh: 1: kill: Illegal number: g
/bin/sh: 1: kill: Illegal number: 
/bin/sh: 1: kill: Illegal number: X
/bin/sh: 1: kill: Illegal number: 
/bin/sh: 1: kill: Usage: kill [-s sigspec | -signum | -sigspec] [pid | job]... or
kill -l [exitstatus]
/bin/sh: 1: kill: Illegal number: n
/bin/sh: 1: kill: Illegal number: i
/bin/sh: 1: kill: Illegal number: /
/bin/sh: 1: kill: Illegal number: s
/bin/sh: 1: kill: Illegal number: r
/bin/sh: 1: kill: Illegal number: /
/bin/sh: 1: kill: Illegal number: .
/bin/sh: 1: kill: Illegal number: c
/bin/sh: 1: kill: Illegal number: t
/bin/sh: 1: kill: Illegal number: e
/bin/sh: 1: kill: Illegal number: 
/bin/sh: 1: kill: Illegal number: h
/bin/sh: 1: kill: Illegal number: h
/bin/sh: 1: kill: Illegal number: n
/bin/sh: 1: kill: Illegal number: /
/bin/sh: 1: kill: Illegal number: o
/bin/sh: 1: kill: Illegal number: .
/bin/sh: 1: kill: Illegal number: e
/bin/sh: 1: kill: Operation not permitted

/bin/sh: 1: kill: Illegal number: n
/bin/sh: 1: kill: Illegal number: a
/bin/sh: 1: kill: Illegal number: o
/bin/sh: 1: kill: Illegal number: e
/bin/sh: 1: kill: Illegal number: x
/bin/sh: 1: kill: Illegal number: c
/bin/sh: 1: kill: Illegal number: t
/bin/sh: 1: kill: Illegal number: a
/bin/sh: 1: kill: Illegal number: m
/bin/sh: 1: kill: Operation not permitted

/bin/sh: 1: kill: Illegal number: m
/bin/sh: 1: kill: Illegal number: .
/bin/sh: 1: kill: Illegal number: t
/bin/sh: 1: kill: Illegal number: s
/bin/sh: 1: kill: Illegal number: z
/bin/sh: 1: kill: Illegal number: a
/bin/sh: 1: kill: Illegal number: v
/bin/sh: 1: kill: Illegal number: t
Killed

Pythonのメアストロがスクリプトを見て、これらすべての/bin/sh: 1: kill: Illegal number: <whatever>警告/エラー/出力が表示される理由を理解できますか?それらを修正する方法について何か提案はありますか?前もって感謝します!

4

3 に答える 3

3
for i in range(1, len(grepResults), 9):
    pid = grepResults[i]
    killPidCmd = "kill -9 " + pid
    subprocess.call([killPidCmd], shell=True)

grepResultsは単純な文字列のようで、そこから1文字を選択しています。そのためkill、あなたが与えている奇妙な数字(数字ではなく文字)について不平を言います。このコマンドの出力を確認すると、何が問題になっているのかがわかります。

grepResults = subprocess.check_output([grepCmd], shell=True)

そのようなものを挿入して、自分にpid合っているかどうかを確認してください。また、基準(if 'grep' in line)が他のプロセスに適合し、一致しないことを確認してください。たぶん、ここにif句を追加する必要があります。

import subprocess
grepCmd = "ps -aef | grep tomcat"
grepResults = subprocess.check_output([grepCmd], shell=True)
for line in grepResults.strip().split('\n'):
    if 'grep' in line: 
        continue
    pid = line.split()[1]
else:
    pid = None
# print pid

の場合、実行中のサービスpidNone見つからなかったため、エラーで終了するはずです。また、複数を強制終了する場合はpid、もちろん、リストを作成するか、このループ内のpidを直接強制終了する必要があります。

于 2012-10-02T11:02:21.140 に答える
1

問題は、実際には文字列である場合に、grep出力をリストのように扱っていることです。行を変更します。

killPidCmd = "kill -9 " + pid

に:

killPidCmd = "echo kill -9 " + pid

..そして出力を見てください、そして問題は明らかになるでしょう。

使用しないスクリプトのわずかに調整されたバージョンshell=True(これはめったに必要ではなく、シェルエスケープで問題を引き起こす)は、Pythonのgrepと同等です。

import os
import subprocess


def main():
    # Shutdown Tomcat
    scriptPath = "%s/bin/shutdown.sh" % (os.environ[TOMCAT_HOME])
    shutdownCmd = ["sh", scriptPath]
    subprocess.call(shutdownCmd)

    # Check for PID
    psCmd = ["ps", "-aef"]
    p = subprocess.Popen(psCmd, stdout=subprocess.PIPE)
    so, se = p.communicate()

    grep = [line for line in so.splitlines() if "python" in line]

    for line in grep:
        pid = line.split()[1] # Second column
        killPidCmd = ["kill", "-9", pid]
        subprocess.call(killPidCmd)

if __name__ == '__main__':
    main()

繰り返しますが、すべてが正しく機能していることを確認するためにに変更killPidCmd = ["kill", "-9", pid]することをお勧めしますkillPidCmd = ["echo", "kill", "-9", pid]

そうは言っても、これはシェルスクリプトとしてはるかに簡単です。

${TOMCAT_HOME}/bin/shutdown.sh

pids=$(ps -aef | grep tomcat | awk '{print $2}')
kill -9 ${pids}
于 2012-10-02T11:30:04.203 に答える
1

これらのメッセージを取り除くために、にリダイレクトstderrを試みることができます。/dev/null./script.py 2>/dev/null

于 2012-10-02T10:58:13.773 に答える