2011-03-05 2 views
1

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

ответ

0

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

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

On shutdown: remove pidfile 
+0

Я не вижу много файлов pid в этой папке, многое отсутствует. Где-то еще? – Blackbinary

+0

Вот где системные pidfiles должны быть помещены в соответствии с [FHS] (http://www.pathname.com/fhs/2.2/fhs-5.13.html). Если вы пишете программу на уровне пользователя, вы можете поместить pidfile в домашний каталог пользователя (~ /. [Name]/[name] .pid). – i80and

+0

Этот подход вводит условие гонки, не так ли? – Vlad

5

Обычно гонки бесплатный способ сделать это:

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

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

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

0

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

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

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

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

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