Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Запрет запуска двух процессов

304
26 мая 2009 года
Fenyx
707 / / 26.01.2005
Есть например скриптец который
а) выполняется долго
б) не должен выполнятся паралельно
в) запущен под игнор юзверь аборт и сет тайм лимит 0
Вот и стал вопрос как запретить запуск двух копий скрипта?
Реализовал через создание в конструкторе файла, который указывает что был запущен скрипт и удаление этого файла в деструкторе, но если некорректно завершится процесс деструктор по идее не сработает соответственно скрипт не запустится повторно даже если он выполнился не полностью
Может у кого есть идеи на этот счет?
287
26 мая 2009 года
Shiizoo
958 / / 14.03.2004
Как-нибудь вот так:
Про демоны на compdoc.ru.
Про атомарное создание pid-файла на unixfaq.ru.

За степень родства описанного там с граблями не ручаюсь. =)
276
26 мая 2009 года
Rebbit
1.1K / / 01.08.2005
Пришел в голову полный изврат.
Как я понимаю в скрипте есть цыкл ? Если да то может так:
Гдето делаем ячейку с атомарным доступом (в той же БД например)
В цыкле раз в никогда (к примеру каждые 100 итерацый) обновляэм в нашей ячейке поточную дату. Експериментально устанавливаем примерное время для ентих вот 100 итерацый, додаем к нему большой запас и проверяем перед началом с SELECT FOR UPDATE.
После завершения не обнуляем ячейку так как пустое значение перед началом нам не подходит изза того же SELECT FOR UPDATE или UPDATE.

ЗЫ. ногами не пинать. Сам понимаю что криво, а лутше просто не умею.
92
26 мая 2009 года
Тень Пса
2.2K / / 19.10.2006
pid/lock файл тебя спасет. первый постер про pid написал уже.

ЗЫ: Rebbit, а за что пинать? ) просто почитай ссылки выше :)
304
26 мая 2009 года
Fenyx
707 / / 26.01.2005
Цитата: Тень Пса
pid/lock файл тебя спасет.



не могу понять каким образом спасет pid-file?
Сперва создайте временный файл, содержащий pid, а потом попытайтесь слинковать его на место: link(2). Если pid-file уже существует, то link(2) вернет EEXIST, а если нет, то атомарно появится pid-file с уже готовым содержимым. Не забудьте удалить временный файл.
Или я чего то не понимаю, но смысл в этом, если при корректном завершении работы скрипта, он сам может удалить временный файл, а вот при некорректном файл останется
Содержимое файла меня интересует мало, само наличие семафора(файла в данном случае) уже говорит о том что скрипт запущен, но как добится удаления этого файла при любых ситуациях как то не могу понять ((

287
26 мая 2009 года
Shiizoo
958 / / 14.03.2004
Ну, я немного о другом решении думал, но подумал, что все и так решится. А так две мысли:
1. Выбирать pid из pid-файла и пытаться общаться с этим процессом средствами межпроцессного взаимодействия (как-нибудь ^_^). Если он правильно отвечает — значит наш клиент. =)
2. Вместо пид файла использовать unix-сокет.
92
26 мая 2009 года
Тень Пса
2.2K / / 19.10.2006
Цитата: Fenyx
не могу понять каким образом спасет pid-file?
Сперва создайте временный файл, содержащий pid, а потом попытайтесь слинковать его на место: link(2). Если pid-file уже существует, то link(2) вернет EEXIST, а если нет, то атомарно появится pid-file с уже готовым содержимым. Не забудьте удалить временный файл.
Или я чего то не понимаю, но смысл в этом, если при корректном завершении работы скрипта, он сам может удалить временный файл, а вот при некорректном файл останется
Содержимое файла меня интересует мало, само наличие семафора(файла в данном случае) уже говорит о том что скрипт запущен, но как добится удаления этого файла при любых ситуациях как то не могу понять ((


дык в pid файле лежит pid процесса, чекать, есть файл (дальше), есть процесс с таким pid (отбой)... нет процесса с таким pid но есть файл (перезаписываем pid в файл и дальше) :)

304
26 мая 2009 года
Fenyx
707 / / 26.01.2005
Ога, а каким образом узнать pid процесса в пхп скрипте? )
287
26 мая 2009 года
Shiizoo
958 / / 14.03.2004
Там по ссылке говорилось о том, что может другой процесс под этим pid'ом уже к тому времени жить. Правда я тоже считаю, что это ухх как маловероятно. Но если все-таки очень робастно прогать все запрогать, то надо при запуске экземпляра программы выполнять его блокировку (flock()). Только вот не знаю, как там под nix, а под вынь у меня порой файлы так и оставались навеки залоченными. Не моими усилиями правда. :)
304
26 мая 2009 года
Fenyx
707 / / 26.01.2005
хехе
getmypid — Gets PHP's process ID
НО это ничего не дает )))) Запускаю скрипт, узнаю его pid и записываю в файл ))) а дальше что? ))) при повторном запуске скрипта, что это мне дало ну есть файл, pid не совпадает - значит можно выполняться, а на самом деле нельзя )) берем вариант когда функции exec недоступны.
12
26 мая 2009 года
alekciy
3.0K / / 13.12.2005
Цитата: Тень Пса
дык в pid файле лежит pid процесса, чекать, есть файл (дальше), есть процесс с таким pid (отбой)... нет процесса с таким pid но есть файл (перезаписываем pid в файл и дальше) :)


Угу, не самый плохой вариант. Только подумай над ним в контексте nginx+php-fpm к примеру ;)

12
26 мая 2009 года
alekciy
3.0K / / 13.12.2005
Цитата: Fenyx

Может у кого есть идеи на этот счет?


Не понимаю, чего народ велосипеды изобретает. Есть же мьютексы, есть же симофоры...

92
27 мая 2009 года
Тень Пса
2.2K / / 19.10.2006
у меня не хорошо с php =) подумаю обязательно, но и nginx не пользовал особо )
304
27 мая 2009 года
Fenyx
707 / / 26.01.2005
Цитата: alekciy
Не понимаю, чего народ велосипеды изобретает. Есть же мьютексы, есть же симофоры...


Семафоры не доступны на хостинге ( Мьютексы тем более
нужен механизм использующий страндартные средства ПХП

304
27 мая 2009 года
Fenyx
707 / / 26.01.2005
Решение найдено и прстое )
Код:
<?php
echo time().'<br>';
$fp = fopen("test.txt", "w+");

if (flock($fp, LOCK_EX|LOCK_NB, $int)) { // выполнить эксплюзивное запирание
 echo $int;
 echo time().'<br>';
    fwrite($fp, "Что-нибудь пишем111\n");
    sleep(60);
    flock($fp, LOCK_UN); // отпираем файл
} else {
    echo "Не могу запереть файл !";
}
echo time().'<br>';
echo 'Done';
fclose($fp);
?>
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог