Как запретить запуск скрпита повторно, если он работает?

Тема в разделе "PHP", создана пользователем асс, 23 мар 2011.

Модераторы: latteo
  1. асс

    асс

    Регистр.:
    13 окт 2006
    Сообщения:
    756
    Симпатии:
    221
    Добрый день, есть ситуация.
    Работает сркипт запущенный по крон назовем его

    a.php

    Так вот мне надо как то сделать, чтобы крон сработал в холостую если скрипт a.php еще выполняется.

    тоесть надо типа
    PHP:
    if(count($output)>1) {
            echo 
    'скрипт  еще  работает';
            echo 
    date('h:i:s') . "\n";
            
    print_r($output);

    }
    else {
            echo 
    'скрипт уже отработал  запускаем повторно;
            echo date('
    h:i:s') . "\n";
            print_r($output);
    }


    ниже код скрипта
     
  2. chang

    chang

    Регистр.:
    20 ноя 2009
    Сообщения:
    363
    Симпатии:
    117
    есть такая хорошея штука как мьютекс
    в пхп их поддержка отсутствует ( хотя я могу ошибаться )
    но их работу можно эмулировать файлами или БД

    Перейти по ссылке

    можно еще на семафорах, но походу работа с ними на фиговых хостингах запрещена

    Перейти по ссылке
    Перейти по ссылке

    ------

    короче если через эмулированный мюнтекс то общий смысл такой:

    1) перед началом выполнения скрипт проверяет наличие какого-то файла ( или установленного поля в БД)
    2) если он есть то скрипт либо отваливается ( запустится на след. запуске крона ) либо слипается
    3) если его нету, то скрипт создает файл ( или ставит признак в БД ) и начинает работать
    4) после окончания работы скрипт удаляет файл (или затирает признак в БД )

    если итерация на кроне подобрана более менее оптимально, т.к. не будет случая когда более 100 запущенных процессов уйдет в слип - то должно работать как часики
     
    асс нравится это.
  3. асс

    асс

    Регистр.:
    13 окт 2006
    Сообщения:
    756
    Симпатии:
    221


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

    В принципе работает быстро проверка но меня беспокоит ка
    решить вопрос с дублями процессов.

    может еще как вариант set_time_limit(18000); 30 минут.
    через 35 минукт дергать файл снова.
    Тольк боюсь завершит ли таким спосбом работу скрипт.


    А можно ли получить PID запущенного файла?
    к примеру файл sex.php запускаем кроном или по http
    в базу заносим его PID затем при новом запуске
    проверяем этот пид в процессах, и если он есть то не запускаем 2 скрипт.
     
  4. saen

    saen

    Регистр.:
    6 авг 2006
    Сообщения:
    756
    Симпатии:
    129

    int getmypid (void)
    Возвращает идентификатор ID текущего процесса РНР или FALSE при ошибке.

    Проверить запущенный процесс по его идентификатору можно системной командой "ps №процесса".
     
  5. a_n_d_y

    a_n_d_y

    Регистр.:
    26 мар 2006
    Сообщения:
    465
    Симпатии:
    61
    Самый простой вариант создавать пустой файл с определенным именем в начале работы скрипта и удалять его при окончании, соответственно в начале скрипта вставляем проверку на существование данного файла, если он есть уходим, если нет то вперед :)
     
  6. асс

    асс

    Регистр.:
    13 окт 2006
    Сообщения:
    756
    Симпатии:
    221

    Про этот вариант уже мне говорили.
    Но вдруг процесс сломается или еще чего а файл не удалится.
    Тогда крон всегда будет давать
    пустой ход.



    echo '<br />getmypid: ' .getmypid(); Вот так отдает PID
    правда еще не совсем разобрался
    но покопаю пока сюда
     
  7. saen

    saen

    Регистр.:
    6 авг 2006
    Сообщения:
    756
    Симпатии:
    129
    Если у тебя крон запускает несколько процессов, как ты узнаешь что нужный процесс отработал и при этом не создался новый с таким идентификатором?
     
  8. асс

    асс

    Регистр.:
    13 окт 2006
    Сообщения:
    756
    Симпатии:
    221

    Pid Созданный файлом записать в базу
    или в файлик, в конце как вы уже сказали стирать его.
     
  9. Monterpan

    Monterpan Постоялец

    Регистр.:
    3 мар 2008
    Сообщения:
    150
    Симпатии:
    27

    проверять время последнего изменения файла: если больше определенного, то удаляем его.
     
  10. a_n_d_y

    a_n_d_y

    Регистр.:
    26 мар 2006
    Сообщения:
    465
    Симпатии:
    61
    Такое может произойти с любым из вариантов :)