[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Запуск только одной копии скрипта
Adamant
Не буду описывать весь механизм работы скрипта. Вкраце:

Основной скрипт (он запускается с командной строки "кроном") (назовем его main.php) запускает после каждого определенного действия - вспомогательный скрипт (назовем его timer.php), который отсчитывает заданное время и затем делает запись в статусном txt файле - цифру ноль. Это нужно для того, если основной скрипт "аварийно" завершился, в статусном txt файле было отображен статус работы основного скрипта. Т.е. основной скрипт периодически запускает timer.php "напоминая" о себе.
Т.е. Пока работает основной скрипт, статус его в txt файле - 1.

Как можно осуществить запуск только одной "копии" вспомогательного скрипта timer.php, чтобы каждый следующий экземпляр запущенного таймера не перезаписывал статусный файл. А перезапускался только один "таймер".
sergeiss
Была у меня задача, практически "один в один": надо было с некоторым периодом запускать обработчик, который при запуске сначала должен был проверить, не работает ли предыдущий экземпляр.
Сделал так. Есть некий "статусный" файл. Туда пишется время и статус операции (загрузка данных из файлов в БД). При запуске проверяется время последней операции. Если прошло более 5 минут и одновременно в файле нет записи об успешном окончании операции, то считаем, что предыдущий скрипт запустился и "завис" либо умер в муках. Также возможно, что предыдущий экземпляр успешно завершил обработку, о чем сделал запись. Тогда текущий экземпляр считает себя единственным и начинает работать.
На самом деле, там на загрузку одного файла в БД хватало 5-10 секунд. Время 5 минут было выбрано с большим запасом.

Надеюсь, что это тебе поможет smile.gif

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Adamant
Немного сделал по другому. Но Ваш вариант тоже интересен.
В принципе вопрос больше не актуален. Хотя интересные идеи с удовольствием рассмотрю.
Спасибо.
vagrand
А как насчет смотреть запущен ли процесс файла? Т.е. при помощи ps ax | grep ...

_____________
Senior PHP developer: PHP5, MySQL, JavaScript, CakePHP, Yii/Yii2, Zend Framework, Smarty, XML/Xslt, JQuery, Jquery Mobile, Bootstrap, ExtJS, HTML, HTML5, CSS, Linux, SVN, Git, Memcached, Redis, MongoDB, Zend Guard, Ioncube, FFMpeg, PayPal, Webmoney, Qiwi, Facebook API, Vkontakte Api, Google API, Twitter Api, Steam Api.
Junior Android Developer: Android SDK, многопоточность, работа с HTTP запросами, JSON, SQLite, фрагменты.
bestxp
зачем столько извращений, лок файл создаете и все c pid процесса, раз в консоле то там всё проще
я делал так

public function isActive()
{
if (!file_exists($this->pidFile)) {
$this->stop_server = false;
return false;
}
$pid = trim(file_get_contents($this->pidFile));

//проверяем на наличие процесса
if ($pid && posix_kill($pid, 0)) {
//демон уже запущен
echo "Daemon already started", PHP_EOL;
return true;
} elseif (!empty($pid)) {
//pid-файл есть, но процесса нет
if (!unlink($this->pidFile)) {
//не могу уничтожить pid-файл. ошибка
echo "Daemon not exists, cant`r remove pid file", PHP_EOL;

exit(-1);
}
}


$this->stop_server = false;
return false;
}


и 2 метода

    public function lock()
{
echo 'lock pid', PHP_EOL;
file_put_contents($this->pidFile, getmypid());
}

public function unLock()
{
unlink($this->pidFile);
$this->stop_server = true;
echo 'Unlocked', PHP_EOL;
}


это конечно внутри класса
плюс вывод делал для определения

порядок такой

в скрипте до начала работы

posix_setsid() // вызов функции


запуск проверка isActive()
если окей
делаем lock()

по окончанию unlock()

в случае ошибки работа будет остановлена

работает только по unix и пхп версии 5.3 ( на более низких не проверял)
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.