如何在脚本中消除Python警告?

2024-04-19 17:21:45 发布

您现在位置: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),但每当我运行它时,终端中都会出现以下“警告”:

^{pr2}$

任何Python度量都可以查看脚本并找出为什么我会得到这些/bin/sh: 1: kill: Illegal number: <whatever>警告/错误/输出?关于如何修复它们有什么建议吗?提前谢谢!在


Tags: 脚本trueforbinshshellcallpid
3条回答

问题是,当grep输出实际上是一个字符串时,您将grep输出视为一个列表。。换线:

killPidCmd = "kill -9 " + pid

收件人:

^{pr2}$

……再看看输出,问题就清楚了。在

{1{shell}中很少使用{1}的问题,这会导致shell中很少使用^的问题

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],以验证一切工作正常

也就是说,这将比shell脚本简单得多:

${TOMCAT_HOME}/bin/shutdown.sh

pids=$(ps -aef | grep tomcat | awk '{print $2}')
kill -9 ${pids}

您可以尝试使用./script.py 2>/dev/nullstderr重定向到/dev/null,以删除这些消息。在

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

看起来你的grepResults是一个普通的字符串,你从中挑选了一个字符。这就是为什么kill抱怨你给它的奇怪的数字(不是数字而是字符)。检查此命令的输出,然后您应该看到,出了什么问题:

^{pr2}$

插入类似的内容并检查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。在

相关问题 更多 >