comand-line скрипт, только один процесс в памяти однвременно, getmypid и posix_kill

denver

?>Скриптер
comand-line скрипт, только один процесс в памяти однвременно, getmypid и posix_kill

Сократил данный класс до минимума:
http://www.pure-php.de/node/20

Все работает прекрасно:
1. скрипт запускается
2. берет число из pid.dat файла
3. "пингует" процесс с posix_kill ( $pid, 0 );
4. если процесс есть то умираем
5. если нет процесса пишем в файл свой pid и начинаем работу

Все бы хорошо, но есть интересная багофича. Процессы запускаются от рута по крону, очень часто, и механризм проверки работает. Но если запустить руками процесс от юзера то он начнет работу несмотря на то есть ли в памяти другой (рутовый) или нет. Рутовый же, если есть юзерский процесс, не запустится, т.к. в нем проверка сработает.

Скорее всего posix_kill ( $pid, 0 ) возвращает false не только когда процесса нет, но и когда нет прав посылать ему комманды.

Как правильно проверить висит ли в памяти еще определенный пид?
 

Gorynych

Посетитель PHP-Клуба
на всидку:

1. Берет ли число корректно из pid.dat файла процесс, запускаемый от пользователя?

2. "Видит" (пингует ли) ли процесс, запущенный от пользователя процесс, другой процесс, запущенный от рута по крону? Что-то меня терзают сомнения.
 

denver

?>Скриптер
Gorynych
1. Да, pid из файла получает
2. Как я и писал posix_kill ($pid, 0) с этим пидом возвращает false (в юзеровском процессе), не смотря на то что процесс (запущенный от рута) все еще в памяти.
 

SiMM

Новичок
Юзать там require похоже на дикость.
А чем что-нибудь подобное
PHP:
define('LOCK',fopen(__FILE__,'rb'));
if (!flock(LOCK,LOCK_EX)) die();
#...
не подходит?
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
А posix_kill от пользователя на рутовский процесс сработать не может. Иначе ты как пользователь системные службы положить можешь :)

-~{}~ 12.04.07 20:02:

Как правильно проверить висит ли в памяти еще определенный пид?
Я решаю проблему 2 способами, в зависимости от задачи:
1. вешаю лочку в памяти (XCache, APC ... ) с ограничением срока жизни и обновляю её
2. запускаю "демона": http://phpclasses.segmenta.ru/browse/package/3065.html

хотя flock, кажется, лучше
 
Сверху