обнаружить фоновый процесс в python [duplicate]

Вы никогда не будете free() памятью, что вы не malloc() ed.

Способ, которым компилятор реализует строковые литералы, не является вашим бизнесом: это деталь реализации. Вы можете free() указатель на память, который вы выделили с помощью malloc(), и только те, или вы рискуете жизнью своей системы.

В идеале, вызовы malloc() и free() вызовы должны отображаться на одном и том же «уровне проектирования» (внутри одного и того же файла реализации для того же модуля, например), и они должны идеально соответствовать: один free() для каждого malloc(). но это не всегда возможно.

(Обратите внимание, что некоторая библиотека выделяет блоки памяти, возвращает указатели на эти блоки и инструктирует их освобождать их. В этом случае вам разрешено освобождать эти указатели , но это плохая практика проектирования от людей, которые создали библиотеку.)

47
задан Julien 12 August 2016 в 17:53
поделиться

8 ответов

import psutil

process = filter(lambda p: p.name() == "YourProcess.exe", psutil.process_iter())
for i in process:
  print i.name,i.pid

Дайте все pids «YourProcess.exe»

65
ответ дан Giampaolo Rodolà 16 August 2018 в 11:53
поделиться
  • 1
    Вы сделали очень полезный модуль. Спасибо. – Alex Bolotov 11 February 2010 в 01:16
  • 2
    Несколько кликов, и я закончил (даже в Windows). Отлично. – Moshe Revah 28 March 2011 в 18:07
  • 3
    К сожалению, OS X не позволяет вам получить доступ ко многим атрибутам процесса (имя, exe, cmdline), даже если вы только пытаетесь получить доступ к тем процессам, которые были созданы вами. Если вы не запускаете интерпретатор / скрипт с помощью sudo, то есть. – John 21 September 2011 в 00:40
  • 4
    Да, это ограничение OSX (и это единственная платформа, которая ведет себя так). Вы ничего не можете с этим поделать, кроме использования sudo / setuid. – Giampaolo Rodolà 3 February 2012 в 11:17
  • 5
    Обновление - теперь это исправлено для разных методов, см. code.google.com/p/psutil/issues/detail?id=297 – Giampaolo Rodolà 7 March 2013 в 02:25
  • 6
    Я так и не ставлю; Я часто слышу, как люди говорят, что List Comprehension - это always лучший способ фильтрации списка, потому что он быстрее. например process = [proc for proc in psutil.process_iter() if proc.name == "YourProcess.exe"]. – ThorSummoner 6 February 2015 в 18:57
65
ответ дан Giampaolo Rodolà 6 September 2018 в 05:57
поделиться

Для jython, если используется Java 5, вы можете получить идентификатор процесса Java следующим образом:

из java.lang.management import * pid = ManagementFactory.getRuntimeMXBean (). getName ()

1
ответ дан ccyu 16 August 2018 в 11:53
поделиться
  • 1
    это работает, но я хочу получить PID другого процесса (например, pidof, но без использования pidof) – Alex Bolotov 15 April 2009 в 21:46

Замечание к комментарий ThorSummoner

process = [proc for proc in psutil.process_iter() if proc.name == "YourProcess.exe"].

Я пробовал его на Debian с Python 3, я думаю, что он должен быть proc.name() вместо proc.name.

0
ответ дан Community 16 August 2018 в 11:53
поделиться

Я не думаю, что вы сможете найти чисто портативное решение на основе python без использования / proc или утилит командной строки, по крайней мере, не в самом python. Парсинг os.system не уродлив - кто-то должен иметь дело с несколькими платформами, будь то вы или кто-то еще. Реализация этого для ОС, которую вы заинтересованы, должна быть довольно простой, честно.

3
ответ дан David Cournapeau 16 August 2018 в 11:53
поделиться

Нет единого межплатформенного API, вам нужно будет проверить наличие ОС. Для использования на основе posix / proc. Для Windows используйте следующий код, чтобы получить список всех pids с соответствующими именами процессов

from win32com.client import GetObject
WMI = GetObject('winmgmts:')
processes = WMI.InstancesOf('Win32_Process')
process_list = [(p.Properties_("ProcessID").Value, p.Properties_("Name").Value) for p in processes]

. Затем вы можете легко отфильтровывать процессы, которые вам нужны. Для получения дополнительной информации о доступных свойствах Win32_Process проверьте класс Win32_Process

11
ответ дан Ivan 16 August 2018 в 11:53
поделиться

Во-первых, Windows (во всех ее воплощениях) является нестандартной ОС.

Linux (и большинство проприетарных unixen) являются стандартными операционными системами, совместимыми с POSIX.

The C библиотеки отражают эту дихотомию. Python отображает библиотеки C.

Для этого не существует «кросс-платформенного» способа. Вы должны взломать что-то с помощью ctypes для определенной версии Windows (XP или Vista)

3
ответ дан S.Lott 16 August 2018 в 11:53
поделиться

Боюсь, нет. Процессы уникально идентифицируются pid не по имени. Если вы действительно должны найти pid по имени, тогда вы будете использовать что-то вроде того, что предложили, но оно не будет переносимым и, вероятно, не будет работать во всех случаях.

Если вам нужно только найти pids для определенного приложения, и у вас есть контроль над этим приложением, тогда я бы предложил изменить это приложение, чтобы сохранить его pid в файлах в каком-то месте, где ваш скрипт может его найти.

1
ответ дан ubiyubix 16 August 2018 в 11:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: