Атомарный запуск и запрос информации о процессе в PythonPython

Программы на Python
Anonymous
Атомарный запуск и запрос информации о процессе в Python

Сообщение Anonymous »

Я пишу простой модуль управления процессами на Python. Модуль может запускать и завершать процессы, и он должен работать независимо от одной среды выполнения, т. е. процесс, запущенный в процессе A, может быть завершен из процесса B. Мой текущий код выглядит следующим образом:

Код: Выделить всё

class Proc:

def __init__(self, cmd):
self.cmd = cmd
self.pid = None

def run(self):
proc = subprocess.Popen(self.cmd)
self.pid = proc.pid
proc.communicate()
self.pid = None
return proc.returncode

def kill(self, sig: int = signal.SIGINT):
if not self.pid:
return

proc = psutil.Process(self.pid)
if self._process_matches_self(proc):
proc.send_signal(sig)

def _process_matches_self(self, proc):
return proc.cmdline() == self.cmd
Как вы могли заметить, этот код не очень безопасен. Например, если мой процесс завершается сразу после того, как был вычислен if not self.pid и запускается другой процесс с тем же PID и командной строкой, пользователь может завершить неправильный процесс - хотя это может быть очень маловероятно.
Я хотел бы вычислить хеш-значение для запущенного процесса, содержащее командную строку, среду, рабочий каталог, идентификатор процесса и время запуска. Однако даже если я сделаю это сразу после subprocess.Popen, он может пострадать от того же состояния гонки: если запущенный процесс немедленно вернется, psutil.Process может получить неправильный процесс, и я вычислю хеш-значение неправильного процесса.
Есть ли способ сделать это более атомарным? Насколько мне известно, psutil не может запускать процессы, а subprocess.Popen имеет только очень простые свойства процесса. Есть ли лучший способ сделать это?

Подробнее здесь: https://stackoverflow.com/questions/790 ... -in-python

Вернуться в «Python»