PHP + shell - запуск процесса из PHP - PullRequest
0 голосов
/ 08 апреля 2011

Доброго всем дня.

Мне нужно сделать это:

С компьютера где-то в этом мире мне нужно получить доступ к определенному URL и запустить процесс. Единственная проблема состоит в том, что, поскольку процесс может длиться более 5 часов и может возвращать некоторые ошибки (процесс переместится через них), PHP-команды, такие как exec, shell_exec и т. Д., Не работают (не знаю, почему, но ... все вернуть ошибку и остановить выполнение) ... так что я попробовал это:

  • Я сделал cron, который запускает скрипт
  • используйте php для написания файла скрипта

Все работает нормально, но мне нужно вернуть счетчик, сообщающий мне, когда процесс начнется, поэтому, когда я запускаю сценарий php, который редактирует сценарий оболочки, я возвращаю час системы и начинаю считать до следующей полной минуты (когда скрипт будет выполнен).

Теперь единственная проблема заключается в следующем:

Счетчик СМОЖЕТ работать нормально ... но процессу также нужно некоторое время для запуска, и это время может варьироваться от 3-4 секунд до 1 минуты. Мой вопрос ... могу ли я получить хотя бы подсказку, если не точное время начала процесса и точное время его запуска?

Я не знаю ... вроде записи в файл и сценарий php прочитал его на минуту, чтобы увидеть, когда что-то изменилось?

Хорошо ... Я обещал добавить некоторые детали:

Процесс потоковый. Жить. Вот что мне нужно сделать:

создать поток дать счетчик пользователю, когда поток начнется

Я использую ffmpeg для потоковой передачи. В файле start.php есть что-то вроде:

   // Create a file called script.sh

   $string = "ffserver & ffmpeg -i pipe.avi http://localhost:8090/feed1.ffm& echo exit 0 > script.sh& exit 0";

   //write string to script.sh
   //create a file that contains the exact time when the script was run.

Cron выглядит так:

   * * * * * /var/www/html/script.sh > /dev/null
   and some other crons that doesn't matter

Так что я могу создать счетчик, который получает время запуска скрипта и подсчитывает время до следующей минуты, когда запустится cron. Дело в том, что у ffmpeg есть некоторое время до его запуска (тестирование кодеков, проверка файла и т. Д.). Мне нужно получить это время и включить его в таймер, чтобы при запуске потока говорящий говорит «Привет». Разве ему не приятно делать что-то вроде: «Хорошо ... это работает? Да? Привет, чел.» и нехорошо для пользователей терять первые 3-4 предложения. Вот почему мне нужен момент, когда ffmpeg запускается и как-то передает его в скрипт php. Я могу управлять оттуда.

1 Ответ

0 голосов
/ 08 апреля 2011

Я работал в тех местах, где crontab циклически повторялся каждые 5 минут, но в последнее время crontab циклически повторяется каждые 1 минуту.Вероятно, это настраиваемое значение, поэтому, если вы не думаете, что ваш crontab запускается в течение нескольких минут, что может быть причиной.

Ваш процесс должен начаться после того, как значение секунд переместится с 59 на 00.Также могут быть небольшие задержки запуска записи в crontab, если какой-то другой процесс уже использует большинство / все системные ресурсы.

Но если посмотреть на это с другой точки зрения, если вы создаете записи в crontab с определенным временемзначение, то вы знаете, во сколько начать смотреть, + 2-3 секунды, верно?

Пожалуйста, измените вашу публикацию, включив в нее пример того, как выглядит ваша запись в crontab, которую создает ваша система (есть ли* 'в этом, это мой главный интерес).


Перечитывая свой пост, я вижу, что вы не программируете создание записи в crontab.Не берите в голову это.

Если ваш процесс работает в течение многих часов, почему вы должны немедленно подключиться к нему.Если он дает сбой в течение первых 30 секунд, не ждет ли он максимум 1 минуты, чтобы выяснить это достаточно хорошо?

Наконец, в среде оболочки есть 99,9999% времени, способ отловить процессвывод с самого начала.Идея того, чтобы ждать, чтобы начать получать результат, требует большего объяснения.Это что-то связанное с тем, что программа работает на удаленной машине?Удаленная программа должна захватить его вывод, а затем вы «получите» этот вывод в качестве отдельного подпроцесса.

Надеюсь, это поможет.

...