Как скрыть предупреждения Python в моем скрипте?
Я хочу сценарий 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 meastros взглянуть на сценарий и понять, почему я получаю все эти /bin/sh: 1: kill: Illegal number: <whatever>
предупреждения / ошибки / Выходы? Любые предложения относительно того, как их исправить? Заранее спасибо!
3 ответа
for i in range(1, len(grepResults), 9):
pid = grepResults[i]
killPidCmd = "kill -9 " + pid
subprocess.call([killPidCmd], shell=True)
Похоже, ваш grepResults - это простая строка, и вы выбираете из нее отдельные символы. Вот почему 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
Если pid
является None
, он должен завершиться с ошибкой, так как не было найдено ни одной работающей службы. И если вы хотите убить более одного pid
Конечно, вы должны создать какой-то список или напрямую убить pid в этом цикле.
Вы можете попробовать перенаправить stderr
в /dev/null
с ./script.py 2>/dev/null
избавиться от этих сообщений.
Проблема в том, что вы рассматриваете вывод grep как список, когда он на самом деле является строкой. Измените строку:
killPidCmd = "kill -9 " + pid
Для того, чтобы:
killPidCmd = "echo kill -9 " + pid
..И посмотри на вывод, и проблема будет понятна.
Слегка подправленная версия скрипта, которая не использует shell=True
(что редко требуется и вызывает проблемы с экранированием оболочки), делает эквивалент в grep в 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()
Снова я бы рекомендовал вам изменить 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}