Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Запуск shell-скрипта из PHP-скрипта

21K
19 октября 2006 года
korsak
2 / / 19.10.2006
Коллеги, прошу помощи.

Ситуация такова.

У меня на сервере (под Free BSD) из php-скрипта запускается (через passthru)
shell-скрипт, который, выполнив некоторые дейстия (установка нужных переменных окружения), запускает затем на исполнение скомпилированный файл (большое внешнее приложение стороннего разработчика, написанное на С). Так вот, по ряду внешних причин это внешнее приложение время от времени подвисает (оно коннектится с другим сервером и обрабатывает полученные данные, вот тут-то порой бывают траблы) и это приводит к тому, что после 10-го или 20-го за день запуска
скрипт вообще перестаёт работать - ничего не делает, passthru в качестве
возвращает -1 (а в норме ноль).

И такое состояние сервера длится несколько часов (при этом веб-сервер работает нормально, выдаёт странички посетителям сатйа и т.п) - то есть невозможно выполнить что бы то ни было с использованием шелла - не только этот php-скрипт, а любые другие, содержащие passthru, system, exec.

Насколько я понимаю, виснущее внешнее приложение плодит незавершённые процессы,
и когда их число превышает некий лимит, UNIX лишает РНР возможности запускать
какие бы то ни было shell-скрипты?
Как избежать такой ситуации, в каком направлении копать?
Как средствами РНР или шелла отследить, что внешнее приложение зависло и принять меры (убить лишние процессы или что там нужно сделать в такой ситуации)???
240
20 октября 2006 года
aks
2.5K / / 14.07.2006
Я, не веб-разработчик но все же попробую дать несколько советов. Может пригодятся. )

Во первых есть ли доступ к исходному коду того внешнего приложения?
Наиболее простой способ контроля наверное - организовать watchlog. Тоесть то внешнее приложение например с каким то интервалом в процессе выполнения подает какие то признаки жизни, например посылает сигналы по каким либо каналам связи (их бывает несолько видов) или хотя бы пишет в файл - не важно. Другая программа или скрипт - следят за этим и если наблюдаемый процесс перестал подавать эти признаки жизни - закрывать его. Так же можно поставить время жизни этого приложения, когда оно гарантированно уже должно было выполнится или уже явно не несет полезной нагрузки. Ну допустим прошел час, полчаса, 15 минут с момента запуска, а оно все выполняется. Тогда тоже можно закрывать процесс.

Хотя сама организация запуска каждый раз отдельного процесса по HTTP запросу помоему как то не правильно. процесс это все таки тяжелая вещь для ОС и сколько угодно их создать одновременно не получится. Логичней было бы изменить это внешнее приложение так чтобы это был тоже всегда запущенный сервер, которому из php подается нужный запрос и он уже выполняет нужные действия. А так же за ним можно прощще следить на предмет зависания и в случае такого, закрывать и перезапускать. Я понимаю - это возможно неприемлимо и нет возможности переписывать или дописыывать код или делать свое приложение, но все же это более грамотно.
21K
20 октября 2006 года
korsak
2 / / 19.10.2006
Спасибо большое! Теперь хоть какие-то зацепки есть :)


Добавлю, что ещё странности связаны с тем, что мой шелл-скрипт (запускаемый из РНР) реально запускается то под bash то под tcsh.

Как так происходит, ума не приложу. В первой строке скрипта ясно указано: #!/usr/local/bin/tcsh

А поскольку у bash и tcsh синтаксис различен (установка переменных окружения и т.п), скрипт то нормально работает, то ненормально.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог