Узнать - запущен ли процесс (Unix)

alexhemp

Новичок
Узнать - запущен ли процесс (Unix)

Итак условия - имеется некоторое количество различных "фоновых" процессов, запускаемых по крону.

Они зависят друг от друга, и каждый из них не должен

1. Запускаться повторно
2. Запускаться если "конкурирующий" процесс уже работает
3. Более "важный" процесс должен уметь "попросить" процесс менее "важный" завершиться.

Сейчас сделано с использованием спец. флагов в БД, процессы на каждой итерации считывают "флаги" и действуют согласно им. Но это увы не работает, т.к. периодически процессы "падают". Падают редко, раз может в сутки. Но в результате, флаг активности остается и вся остальная работа не делается.

Проблема - как определить что процесс запущен? Допустим я могу взять через posix_getpid идентификатор процесса, но как определить что процесс с таким PID работает? (не считаясь с тем фактом что это уже может быть совсем другой процесс, все-таки их на хостинге постоянно порождается много, а PID-ов всего 2^16 - :) вероятность совпадения низка, проверка будет в пределах 5 минут от падения).

-~{}~ 28.04.06 17:44:

Да, забыл сказать

Фоновые процессы пускаются из под своего юзера

И хотелось бы из-под пользователя Web-сервера тоже узнавать их состояние...
 

Tor

Новичок
Падают редко, раз может в сутки
т.е. постоянно падают

дальше идут костыли/подпорки

флаг активности остается
в файл-флаг писать текущее время на каждой итерации
если флаг есть, но внутри старое время, то вывод очевиден
 

whirlwind

TDD infected, paranoid
Проблема - как определить что процесс запущен? Допустим я могу взять через posix_getpid идентификатор процесса, но как определить что процесс с таким PID работает?
[m]pcntl_signal[/m] с нулевым сигналом
подробный статус [m]pcntl_wifexited[/m]
больше деталей - см. функции pcntl_
 

alexhemp

Новичок
Tor

Падает php-cli. Редко - понятие оносительное. Падеж примерно 1 раз на 100000 запросов +- 50%.

Там ничего такого нет криминального - просто чтение из сокета, по логам падает очень редко на большой задержке ответа от удаленного HTTP. Искать проблемы в php, операционной системе считаю излишним... Достаточно workaround-а.

Собственно идея понятна, использовать время как признак. В принципе логично, если процесс не обновлял время уже 10 минут то скорее всего он помер.
 

vadim

Guest
alexhemp
А нельзя системными вызами узнатьЮ, какие процессы работают, в UNIX-е же соответствующие команды/программы есть
 
Сверху