2014-09-18 3 views
0

Я пытаюсь написать программу, которая контролирует серверы игр в Python. Для этого n нужно проверить, работает ли процесс сервера игр, который запущен на сеансе экрана, и для этого мне нужен pid, однако я не получаю pid сеанса экрана, Я получаю pid, который существует только до тех пор, пока всплывающая сессия не будет активна. Pid сеанса экрана - это один pid выше, чем возвращается метод ppid popen .pid(). Я знаю, что это может быть вызвано оболочкой = True, но я запускаю ее с shell = False. Любой чистый способ получить pid экрана/игрового сервера в процессе экрана? Моим единственным другим решением было бы просто написать .pid() + 1, но я предполагаю, что это было бы ужасным обходным путем.Python subprocess.popen wrong pid

Вот соответствующая часть моего кода:

proc = Popen(["screen", "-dmS", self.name, "./srcds_run", "-port", str(self.port), "-game", self.modDir], shell=False) 

Спасибо заранее.

ответ

0

Ваша проблема не в python, это с экраном.

Когда вы запускаете экран с -dmS, и он переходит в фоновый режим, он делает некоторые разветвления и сам по себе, поэтому новый PID, если вы используете strace для проверки системных кодов, вы увидите, как выполняется бинарный экран в возвращаемом PID, который вы видите, он позже выполняет другие процессы и завершает работу.

Это другой процесс, который вы видите в ваших ps вызовов

+0

Любые решения для чистого пути, чтобы получить PID? Или может просто взять .pid() + 1? – Rapogh

+0

Кажется, что нет чистого способа его получить, однако я бы предположил, что экран детерминирован таким образом, поэтому, если конечный процесс равен +1, вы можете считать, что это будет +1 99% времени, условия гонки относительно этого числа могут появиться, если другие процессы вокруг. –

+0

ОК, спасибо :) Сделаю это или просто получаю pid с screen -ls – Rapogh

Смежные вопросы