Определить, запущен ли процесс? - PullRequest
1 голос
/ 05 марта 2011

Есть ли простой способ определить, запущен ли определенный процесс? Мне нужно знать, работает ли экземпляр моей программы в фоновом режиме, и если нет, то форкнуть и создать фоновый процесс.

Ответы [ 3 ]

5 голосов
/ 06 марта 2011

Обычно это можно сделать без участия расы:

  • Открыть файл блокировки / файл pid для записи (но не обрезать его)
  • Попытка получить эксклюзивную блокировку (используя fcntl или flock) без блокировки
  • Если это не удается с EAGAIN, значит, другой процесс уже запущен.
  • Дескриптор файла теперь должен быть унаследован демоном и оставлен открытым на время его жизни

Преимущество этого перед простым хранением PID состоит в том, что если кто-то повторно использует PID, вы не получите ложного срабатывания.

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

0 голосов
/ 06 марта 2011

Программное обеспечение Linux, в общем и целом не заботится об эксклюзивности программ, только о ресурсах, которые они используют. «Забота» чаще всего обеспечивается реализацией (например, инфраструктура дистрибутива).

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

Если это процесс, который открывает сокет (например, порт TCP), программа может завершиться ошибкой, если она не может открыть сокет. Если ему нужен монопольный доступ к файлу, отключите его, если он не сможет его получить. Поддержите PID-файл, но не делайте его обязательным.

Вы увидите эту методологию во всем программном обеспечении GNU, которое является частью того, что делает его таким универсальным.

0 голосов
/ 05 марта 2011

Обычно это делается с помощью pidfiles: файла в /var/run/[name].pid, содержащего только идентификатор процесса, возвращаемый fork ().

if pidfile exists:
  exit()
else:
  create pidfile
  pid = start_background()
  pidfile.write(pid)

On shutdown: remove pidfile
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...