Frage

Ich möchte ein Python-Skript grep extrahieren Sie für einen bestimmten Prozess seine PID und beenden Sie sie.Hier ist, was ich benutze:

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()

Obwohl mein Prozess (Apache Tomcat) heruntergefahren wird, erhalte ich die folgenden "Warnungen" im Terminal, wenn ich ihn ausführe:

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

Kann sich irgendein Python-Meister das Skript ansehen und herausfinden, warum ich all das bekomme /bin/sh: 1: kill: Illegal number: <whatever> warnungen / Fehler / Ausgaben?Irgendwelche Vorschläge, wie man sie beheben kann?Danke im Voraus!

War es hilfreich?

Lösung

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

Es sieht so aus, als ob Ihre grepResults eine einfache Zeichenfolge sind und Sie einzelne Zeichen daraus auswählen.Deshalb ist kill beschwert sich über seltsame Zahlen (die keine Zahlen, sondern Zeichen sind), die Sie ihm geben.Überprüfen Sie die Ausgabe dieses Befehls, dann sollten Sie sehen, was falsch läuft:

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

Fügen Sie so etwas ein und prüfen Sie, ob pid passt zu dir.Stellen Sie außerdem sicher, dass die Kriterien (if 'grep' in line) passen und passen nicht zu anderen Prozessen.Vielleicht müssen Sie hier weitere if-Klauseln hinzufügen.

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

Wenn pid is None, sollte es mit einem Fehler beendet werden, da kein laufender Dienst gefunden wurde.Und falls du mehr als einen töten willst pid, Natürlich müssen Sie eine Liste erstellen oder die PID innerhalb dieser Schleife direkt beenden.

Andere Tipps

Sie können versuchen, den generationspoDiCETAGCODE-Modus mit dem generationspoDicetagcode umzuleiten, um diese Nachrichten loszuwerden.

Das Problem ist, dass Sie die grep-Ausgabe wie eine Liste behandeln, wenn es sich tatsächlich um eine Zeichenfolge handelt..Ändern Sie Ihre Zeile:

killPidCmd = "kill -9 " + pid

Zu:

killPidCmd = "echo kill -9 " + pid

..und schau dir die Ausgabe an, und das Problem wird klar sein.

Leicht optimierte Version des Skripts, die nicht verwendet wird shell=True (was selten notwendig ist und Probleme beim Shell-Escaping verursacht), entspricht grep in Python,

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()

Wieder würde ich dir empfehlen, dich zu ändern killPidCmd = ["kill", "-9", pid] zu killPidCmd = ["echo", "kill", "-9", pid] um zu überprüfen, ob alles richtig funktioniert

Das heißt, das wäre viel einfacher als ein Shell-Skript:

${TOMCAT_HOME}/bin/shutdown.sh

pids=$(ps -aef | grep tomcat | awk '{print $2}')
kill -9 ${pids}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top