Wie kann ich Python-Warnungen in meinem Skript unterdrücken?
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!
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}