Запустить фоновый процесс с помощью shell = True в Windows - PullRequest
0 голосов
/ 03 октября 2018

Я пытаюсь запустить с Python сервер для оценки моделей PMML в Java .Как только вычисления сделаны, я хочу иметь возможность закрыть этот сервер (т.е. завершить процесс).Я на Windows 10. Однако я нахожу это более запутанным, чем я думал.

Сначала я запускаю сервер следующим образом:

p = subprocess.Popen('START /B java -jar openscoring-server-executable-1.4.3.jar',
                      shell=True)

Я делаю этоработать в фоновом режиме, чтобы окно CMD не отображалось при запуске сценария пользователем.Чтобы сделать это возможным, я думаю, что параметр shell=True необходим.

Когда я пытаюсь завершить процесс, используя следующую строку:

subprocess.call("TASKKILL /F /PID {pid} /T".format(pid=p.pid))

Процесс все еще выполняется.Фактически, PID, который возвращает p.pid, даже не существует в диспетчере задач.Я подтвердил это при попытке использовать решение, предоставленное в этом ответе :

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, назначенный процессу, который я хочу уничтожить:

enter image description here

Но я не знаю, как найти этот PID в Python, чтобы завершить его,Ответы, которые я нашел на сайте, похоже, не работают с процессами, работающими в фоновом режиме.

РЕДАКТИРОВАТЬ:

Я думаю, что это можно решить, если я смог запустить командус shell=False, но я не знаю, как это сделать из-за START /B.Это возвращает ошибку:

p = subprocess.Popen(['START', '/B', 'java', '-jar openscoring-server-executable-1.4.3.jar'])

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Вы можете просто найти ваше приложение здесь и закрыть.

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 голосов
/ 03 октября 2018

Если вы не можете определить правильный PID, у меня может быть альтернативное решение, использующее аргументы, которые вы использовали для запуска процесса.Это не так приятно, так как вы будете перебирать дерево процессов, пока не найдете попадание, но таким образом он наверняка найдет процесс.

Просто помните, что это может не всегда возвращать правильный процесс, если у вас есть несколько процессов с одним и тем же аргументом.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...