首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Windows中用shell=True启动的后台进程

在Windows中用shell=True启动的后台进程
EN

Stack Overflow用户
提问于 2018-10-03 15:39:26
回答 3查看 1.4K关注 0票数 0

我试图从Python启动一个服务器在Java中对PMML模型进行评分。计算完成后,我希望能够关闭该服务器(即终止进程)。我在Windows 10上,但是,我发现它比我想象的要混乱得多。

首先,我像这样启动服务器:

代码语言:javascript
复制
p = subprocess.Popen('START /B java -jar openscoring-server-executable-1.4.3.jar',
                      shell=True)

我让它在后台运行,这样当用户运行脚本时,CMD窗口就不会出现。为了实现这一点,我认为shell=True参数是必要的。

当我试图使用以下行来终止进程时:

代码语言:javascript
复制
subprocess.call("TASKKILL /F /PID {pid} /T".format(pid=p.pid))

进程仍在运行。实际上,任务管理器中甚至不存在p.pid返回的PID。在尝试使用这个答案中提供的解决方案时,我已经确认了这一点

代码语言:javascript
复制
def kill(proc_pid):
    process = psutil.Process(proc_pid)
    for proc in process.children(recursive=True):
        proc.kill()
    process.kill()

kill(p.pid)

这将返回异常NoSuchProcess: no process found with pid 5280

我可以通过任务管理器看到分配给我要杀死的进程的PID:

但我不知道如何在Python中找到PID来终止它。我在网站上找到的答案似乎不适用于后台运行的进程。

编辑:

我认为如果我能够使用shell=False运行这个命令,这是可以解决的,但是由于START /B,我不知道如何去做。这将返回一个错误:

代码语言:javascript
复制
p = subprocess.Popen(['START', '/B', 'java', '-jar openscoring-server-executable-1.4.3.jar'])
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-10-03 17:56:55

你可以在这里搜索你的应用程序,然后关闭。

代码语言:javascript
复制
import psutil
import os

ls = []
for p in psutil.process_iter():
    try:
        name = p.name()
        cmdline = p.cmdline()
        exe = p.exe()
        pid = p.pid
    except (psutil.AccessDenied, psutil.ZombieProcess):
        continue
    except psutil.NoSuchProcess:
        continue
票数 0
EN

Stack Overflow用户

发布于 2020-07-02 09:33:32

这一行不工作,因为您需要提供所有的参数和确切的字符串。

代码语言:javascript
复制
if process.cmdline() == args:

我将其更改为包含一些字符串和部分字符串:

代码语言:javascript
复制
def process_get(*args):
        """Returns the process matching ``args``.
        Relies on ``args`` matching the argument list of the process to find.

        Args:
            *args: process arguments, e.g. ["java", "jar", "partialjarname"]

        Returns:
            :obj:`process`
        """
        import psutil
        for process in psutil.process_iter():
            try:
                if all(x in " ".join(process.cmdline()) for x in args):
                    return process
            except psutil.AccessDenied:
                pass
        return None
票数 1
EN

Stack Overflow用户

发布于 2018-10-03 17:55:24

如果您不能找到正确的PID,我可能有一个替代的解决方案,利用您用来启动流程的参数。这不是很好,因为您将在过程树上迭代,直到找到一个命中,但是这样它就可以确定地找到进程。

请记住,如果您有多个具有相同参数的进程,则这可能并不总是返回正确的进程。

代码语言:javascript
复制
def process_get(*args):
    """Returns the process matching ``args``.
    Relies on ``args`` matching the argument list of the process to find.

    Args:
        *args: process arguments, e.g. ["java", "-jar", "somejar.jar"]

    Returns:
        :obj:`process`
    """
    import psutil
    for process in psutil.process_iter():
        try:
            if process.cmdline() == args:
                return process
        except psutil.AccessDenied:
            pass
    return None
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52630855

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档