Простой способ проверки процесса на существование

Для простых многопоточных систем очень часто используют запуск в фоновом режиме.  Запускают их примерно вот так:

php script.php &

И управление процессом от юзера уходит, отловить такой процесс из другого скрипта уже не получится. А если процесс выполняет какую то одну и ту же задачу с интервалом по крону, и нужно, чтобы при запуска нового процесса старый был убит? Поймать его можно аццкой смесью bash + php:

$killPid = exec("ps ux | awk '/script_name.php/ && !/awk/ {print $2}'");//находим пид процесса
      if($killPid)//если есть, киляем
	  exec ("kill ".$killPid);
exec('php script_name.php &');//запускаем новый
5.00 avg. rating (93% score) - 2 votes

7 комментариев

  • Хороший способ, спасибо.

  • Недостаток этого способа — интерпретатор PHP запускает новый процесс, в котором еще и выполняет команды bash, что накладно по ресурсам

  • Интересный способ — нужно воспользоваться

  • Клёвая статья, обязательно её воспользуюсь!!!

  • А без bash способ есть (чисто средствами php)? А то на многих shared-хостингах из php bash не запустишь.

    • Без баша нет, т.к. пхп не имеет выхода на системный уровень при настройках по умолчанию

  • Без bash можно попробовать так:
    1. Прописать флаг запущенного скрипта куда-либо (например в текстовый файл лога либо в БД).
    2. При запуске скрипта (повторном) смотреть, не сброшен ли флаг. Ждать когда отработает первый процесс, либо просто выйти ничего не делая.
    3. В коде скрипта предусмотреть прерывание его по тайм-ауту.
    4. Задавать расписание crone таким образом, чтобы не перекрывался тайм-аут выполнения скрипта.

    ПС: kill процесса скрипта чреват неприятностями неуправляемыми.

css.php