Получение pid программы только началось в Python - PullRequest
1 голос
/ 04 августа 2011

Так что мне нужно создать сценарии запуска и остановки для программы на Python.У меня нет большого опыта в написании файлов сценариев, поэтому, пожалуйста, держите меня в покое.До сих пор моим временным решением было использовать файл startup.sh:

python -m root.scripts.run 
python server.py 'localhost' 42345

. Это запускает мою программу и сервер, который необходим для выполнения некоторых вычислений.Теперь для stop.sh я просто делаю:

killall -m Python
killall python
killall Python

Это работает и останавливает мою программу.Однако мне нужно найти менее «жестокое» решение, поскольку это, очевидно, убивает все процессы, связанные с Python.Решение, о котором я думаю (не уверен, если это возможно), находится в файле startup.sh, чтобы получить PID двух запущенных процессов и сохранить их где-нибудь в файле.Тогда для stop.sh я просто получил бы эти pids и убил бы эти процессы.Теперь у меня есть несколько вопросов:

  1. Является ли мое предлагаемое решение жизнеспособным?Если так, как я могу получить pid недавно запущенных процессов?С точки зрения их хранения и последующего получения из файла, это выполнимо, и если да, то как?
  2. Есть ли у вас какие-либо другие предлагаемые решения для моей проблемы?
  3. С точки зрения кроссплатформенностиКак трудно было бы подражать что-то подобное на Windows?

С уважением, Богдан

Ответы [ 2 ]

4 голосов
/ 04 августа 2011

Используйте модуль subprocess для запуска программы из Python (в любом случае это рекомендуемый способ). Объект, возвращаемый из subprocess.Popen, имеет методы terminate() и kill(), а также атрибут pid, который можно сохранить и использовать для повторной остановки процесса.

В системах Unix вы можете сохранить PID в файле в /var/run/<yourscript>.pid (см. Стандарт иерархии файловой системы ), а затем прочитать этот файл, чтобы получить PID при запросе на остановку.

1 голос
/ 04 августа 2011

Я бы заменил ваш startup.sh на скрипт Python, который запускает оба скрипта.Используйте subprocess.Popen () для запуска новых процессов и terminate () для их уничтожения.

Python решает ваш третий вопрос.В противном случае вам придется использовать cygwin / mingw под Windows.

...