Adamant
21.11.2013 - 02:32
Не буду описывать весь механизм работы скрипта. Вкраце:
Основной скрипт (он запускается с командной строки "кроном") (назовем его main.php) запускает после каждого определенного действия - вспомогательный скрипт (назовем его timer.php), который отсчитывает заданное время и затем делает запись в статусном txt файле - цифру ноль. Это нужно для того, если основной скрипт "аварийно" завершился, в статусном txt файле было отображен статус работы основного скрипта. Т.е. основной скрипт периодически запускает timer.php "напоминая" о себе.
Т.е. Пока работает основной скрипт, статус его в txt файле - 1.
Как можно осуществить запуск только одной "копии" вспомогательного скрипта timer.php, чтобы каждый следующий экземпляр запущенного таймера не перезаписывал статусный файл. А перезапускался только один "таймер".
sergeiss
21.11.2013 - 03:08
Была у меня задача, практически "один в один": надо было с некоторым периодом запускать обработчик, который при запуске сначала должен был проверить, не работает ли предыдущий экземпляр.
Сделал так. Есть некий "статусный" файл. Туда пишется время и статус операции (загрузка данных из файлов в БД). При запуске проверяется время последней операции. Если прошло более 5 минут и одновременно в файле нет записи об успешном окончании операции, то считаем, что предыдущий скрипт запустился и "завис" либо умер в муках. Также возможно, что предыдущий экземпляр успешно завершил обработку, о чем сделал запись. Тогда текущий экземпляр считает себя единственным и начинает работать.
На самом деле, там на загрузку одного файла в БД хватало 5-10 секунд. Время 5 минут было выбрано с большим запасом.
Надеюсь, что это тебе поможет
_____________
*
Хэлп по PHP*
Описалово по JavaScript *
Хэлп и СУБД для PostgreSQL*
Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги. *
"накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)
Adamant
21.11.2013 - 04:11
Немного сделал по другому. Но Ваш вариант тоже интересен.
В принципе вопрос больше не актуален. Хотя интересные идеи с удовольствием рассмотрю.
Спасибо.
vagrand
21.11.2013 - 10:49
А как насчет смотреть запущен ли процесс файла? Т.е. при помощи 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
21.11.2013 - 11:24
зачем столько извращений, лок файл создаете и все 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)) {
if (!unlink($this->pidFile)) {
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 ( на более низких не проверял)