Python проверка запущена ли программа

Содержание

Я пытаюсь создать скрипт на Python, который позже я буду запускать как сервис. Теперь я хочу запускать определенную часть кода только во время работы iTunes. Из некоторых исследований я понимаю, что опрос всего списка команд, а затем поиск приложения для этого списка стоит дорого.

Я обнаружил, что процессы в операционных системах на основе UNIX создают файл блокировки для уведомления о том, что программа в данный момент выполняется, и в этот момент мы можем использовать os.stat(location_of_file) чтобы проверить, существует ли файл, чтобы определить, запущена ли программа или не. Существует ли аналогичный файл блокировки, созданный в Windows? Если нет, то каковы различные способы в Python, с помощью которых мы можем определить, запущен процесс или нет? Я использую Python 2.7 и интерфейс iTunes COM.

nightf0x 16 окт. 2011, в 23:21
Поделиться
Что делает интерфейс COM, если iTunes не работает?
Gabe 16 окт.

2011, в 20:37

Если в python создать объект с использованием COM-интерфейса, COM-интерфейс автоматически открывает iTunes.

На что способен PYTHON

nightf0x 16 окт. 2011, в 20:39

Что бы это ни стоило, это зависит от отдельной программы, хочет ли она создать файл блокировки или файл PID. Не все программы Linux / UNIX делают.

Источник: overcoder.net

Python-сообщество

[RSS Feed]

  • Начало
  • » Python для новичков
  • » Проверить, что программа уже запущена

#1 Июль 25, 2016 08:09:18

Проверить, что программа уже запущена

Как можно проверить, что другая копия этого скрипта уже запущена?

#2 Июль 25, 2016 11:03:04

Проверить, что программа уже запущена

# pip install -U psutil
>>> import psutil >>> «python» in x.name() for x in psutil.process_iter() > True

С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Читайте также:
Как убрать значок программы из панели задач

Отредактировано Rodegast (Июль 25, 2016 11:05:08)

#3 Июль 25, 2016 12:22:18

Проверить, что программа уже запущена

Rodegast
Такой вариант не подходит, потому что в системе могут работать и другие python скрипты.

#4 Июль 25, 2016 15:58:39

Проверить, что программа уже запущена

> в системе могут работать и другие python скрипты.

Тогда проверяй по командной строке:

>>> «/usr/bin/python ./manage.py runserver» in » «.join(x.cmdline()) for x in psutil.process_iter() > True

С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

#5 Июль 26, 2016 00:50:02

Проверить, что программа уже запущена

maks2236
Как можно проверить, что другая копия этого скрипта уже запущена?

Лекция 6. Проверка статистических гипотез (процедуры Python)

Надо создавать файл при запуске и удалять при завершении, и по его наличию на диске определять, запущена ли копия.

#6 Июль 26, 2016 08:00:37

Проверить, что программа уже запущена

py.user.next
ммм, очень интересный способ, спасибо за наводку)
Кажется apt в linux делает так же.

#7 Июль 26, 2016 10:08:00

Проверить, что программа уже запущена

maks2236
Кажется apt в linux делает так же.

Многие приложения так делают (lock-файлы), а пакетные менджеры делают это, чтобы исключить одновременный доступ к пакетной базе данных.

#8 Июль 26, 2016 16:45:57

Проверить, что программа уже запущена

Добавлю, что последовательность операций проверки и создания файла должна быть атомарна(выполняться как одна команда) чтобы избежать гонок при одновременном запуске двух ваших программ сразу. Смотрите на ключик ‘x’ у функции open.

Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

#9 Июль 27, 2016 14:52:34

Проверить, что программа уже запущена

Не совсем понял, как этот ключ может мне помочь. Он не делает операцию атомарной, а просто проверяет существует файл или нет.

#10 Июль 27, 2016 19:35:02

Проверить, что программа уже запущена

maks2236
Он не делает операцию атомарной, а просто проверяет существует файл или нет.

Нет, для вас это будет именно атомарно.

open for exclusive creation, failing if the file already exists

Порядок вызовов на создание файла из разных потоков разрулит операционка.
Вызываете open — если вернул файловый объект, значит захватили блокировку, если словили исключение — обломились.

Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Источник: python.su

Функции для работы c PID модуля psutil в Python.

Функции для работы с запущенными процессами в Python.

Материал содержит описание функций модуля psutil с примерами, которые возвращают список текущих запущенных процессов PID, а также удобные функции проверки существования процесса и ожидания завершения списка экземпляров процесса.

Читайте также:
Какая программа читает jpg

Содержание:

  • psutil.pids() список текущих запущенных PID,
  • psutil.process_iter() итератор всех запущенных процессов,
  • psutil.pid_exists() проверяет, существует ли данный PID,
  • psutil.wait_procs() вызывается, когда один из ожидающих процессов завершается,
  • Пример поиска процесса по имени,
  • Примеры фильтрации и сортировки процессов:
  • Процессы, принадлежащие пользователю,
  • Вывод всех запущенных/активных процессов,
  • Процессы, использующие лог-файлы,
  • Процессы, потребляющие более 500 МБ памяти,
  • Топ-3 процесса, потребляющих больше всего процессорного времени.

psutil.pids() :

Функция psutil.pids() возвращает отсортированный список текущих запущенных PID. Чтобы перебрать все процессы и избежать условий гонки, следует предпочесть функцию psutil.process_iter() .

Пример использования psutil.pids() :

>>> import psutil >>> psutil.pids() # [1, 2, 3, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19, . 32498]

psutil.process_iter(attrs=None, ad_value=None) :

Функция psutil.process_iter() возвращает итератор, возвращающий экземпляр класса psutil.Process() для всех запущенных процессов на локальном компьютере. Это должно быть предпочтительнее, чем psutil.pids() для перебора процессов, т.к. это безопасно от состояния гонки.

Каждый экземпляр psutil.Process() создается только один раз, а затем кэшируется для следующего вызова psutil.process_iter() (если PID еще жив). Также это гарантирует, что PID процессов не будут использоваться повторно.

Аргументы attrs и ad_value имеют то же значение, что и в Process.as_dict() . Если attrs указан, то результат Process.as_dict() будет сохранен как информационный атрибут, прикрепленный к возвращенным экземплярам процесса. Если attrs является пустым списком, то он медленно будет получать всю информацию о процессе.

Порядок сортировки, в котором возвращаются процессы, основан на их PID.

Пример использования psutil.process_iter() :

>>> import psutil >>> for proc in psutil.process_iter([‘pid’, ‘name’, ‘username’]): . print(proc.info) # # # # .

Пример использования выражения генератора словаря для создания структуры данных :

>>> import psutil, pprint >>> procs = p.pid: p.info for p in psutil.process_iter([‘name’, ‘username’])> >>> pprint.pprint(prosc) # # 1: , # 2: , # 3: , # . # >

psutil.pid_exists(pid) :

Функция psutil.pid_exists() проверяет, существует ли данный PID в текущем списке процессов. Это быстрее, чем выполнение выражения pid in psutil.pids() и должно быть предпочтительным.

psutil.wait_procs(procs, timeout=None, callback=None) :

Удобная функция psutil.wait_procs() , ожидающая завершения списка экземпляров процесса. Возвращает кортеж (gone, live) , указывающий, какие процессы завершились, а какие еще живы. У завершенных будет новый атрибут returncode , указывающий статус завершения процесса, возвращаемый Process.wait() .

Аргумент callback — это функция, которая вызывается, когда один из ожидающих процессов завершается и экземпляр Process передается в качестве аргумента обратного вызова (экземпляр также будет иметь установленный атрибут returncode ). Эта функция возвращает результат, как только все процессы завершатся или когда завершиться timeout (в секундах). В отличие от Process.wait() , если завершиться тайм-аут, то функция не будет вызывать исключение TimeoutExpired .

Типичным вариантом использования может быть:

  • отправить SIGTERM в список процессов;
  • дать какое-то время процессам для их корректного завершения;
  • отправить SIGKILL тем процессам, которые еще живы.

Пример, который завершает и ожидает всех дочерних элементов этого процесса:

Читайте также:
Разрешен доступ только пользователю с правом на использование программы настройки

import psutil def on_terminate(proc): print(f»Процесс proc> завершается с кодом proc.returncode>») procs = psutil.Process().children() for p in procs: p.terminate() gone, alive = psutil.wait_procs(procs, timeout=3, callback=on_terminate) for p in alive: p.kill()

Пример поиска процесса по имени.

Для поиска процесса сервера по имени необходимо проверить строку с именем на Process.info[‘name’] . Из документации видно, что функция psutil.process_iter() возвращает объект Process , следовательно функция поиска процесса по имени может быть следующая:

import psutil def find_procs_by_name(name): «Возвращает список процессов, соответствующих ‘name’.» ls = [] for p in psutil.process_iter([‘name’]): if p.info[‘name’] == name: ls.append(p) return ls

Более продвинутая функция поиска процесса по имени может быть с дополнительными проверками на Process.name() , Process.exe() и Process.cmdline() :

import os import psutil def find_procs_by_name(name): «Return a list of processes matching ‘name’.» ls = [] for p in psutil.process_iter([«name», «exe», «cmdline»]): if name == p.info[‘name’] or p.info[‘exe’] and os.path.basename(p.info[‘exe’]) == name or p.info[‘cmdline’] and p.info[‘cmdline’][0] == name: ls.append(p) return ls

Примеры фильтрации и сортировки процессов.

Коллекция примеров кода, показывающих, как использовать psutil.process_iter() для фильтрации процессов и их сортировки.

Процессы, принадлежащие пользователю:

>>> import psutil >>> from pprint import pprint as pp >>> import getpass >>> pp([ . (p.pid, p.info[‘name’]) . for p in psutil.process_iter([‘name’, ‘username’]) . if p.info[‘username’] == getpass.getuser() . ]) # (16832, ‘bash’), # (19772, ‘ssh’), # (20492, ‘python’)]

Вывод всех запущенных/активных процессов:

>>> import psutil >>> from pprint import pprint as pp >>> pp([ . (p.pid, p.info) . for p in psutil.process_iter([‘name’, ‘status’]) . if p.info[‘status’] == psutil.STATUS_RUNNING . ]) # [ # (1150, ), # (1776, ), # (20492, ) # ]

Процессы, использующие лог-файлы:

>>> import psutil >>> from pprint import pprint as pp >>> for p in psutil.process_iter([‘name’, ‘open_files’]): . for file in p.info[‘open_files’] or []: . if file.path.endswith(‘.log’): . print(«%-5s %-10s %s» % (p.pid, p.info[‘name’][:10], file.path)) # 1510 upstart ~/.cache/upstart/unity-settings-daemon.log # 2174 nautilus ~/.local/share/gvfs-metadata/home-ce08efac.log # 2650 chrome ~/.config/google-chrome/Default/data_reduction_proxy_leveldb/000003.log

Процессы, потребляющие более 500 МБ памяти:

>>> import psutil >>> from pprint import pprint as pp >>> pp([ . (p.pid, p.info[‘name’], p.info[‘memory_info’].rss) . for p in psutil.process_iter([‘name’, ‘memory_info’]) . if p.info[‘memory_info’].rss > 500 * 1024 * 1024 . ]) # [ # (2650, ‘chrome’, 532324352), # (3038, ‘chrome’, 1120088064), # (21915, ‘sublime_text’, 615407616) # ]

Топ-3 процесса, потребляющих больше всего процессорного времени:

>>> import psutil >>> from pprint import pprint as pp >>> pp([ . (p.pid, p.info[‘name’], sum(p.info[‘cpu_times’])) . for p in sorted(psutil.process_iter([‘name’, ‘cpu_times’]), . key=lambda p: sum(p.info[‘cpu_times’][:2])) . ][-3:]) # [ # (2721, ‘chrome’, 10219.73), # (1150, ‘Xorg’, 11116.989999999998), # (2650, ‘chrome’, 18451.97) # ]

  • ОБЗОРНАЯ СТРАНИЦА РАЗДЕЛА
  • Статистика использование ресурсов ОС и ЦП, модуль psutil.
  • Статистика использования RAM и SWAP, модуль psutil.
  • Статистика использования диска, модуль psutil.
  • Информация о сетевых картах и их соединениях, модуль psutil.
  • Функции для работы c PID модуля psutil.
  • Информация с датчиков сервера, модуль psutil.
  • Функция users() модуля psutil.
  • Объект Process модуля psutil.
  • Мониторинг служб ОС Windows модулем psutil.
  • Класс Popen() модуля psutil.
  • Встроенные исключения модуля psutil.
  • Константы модуля psutil.

Источник: docs-python.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru