LinuxForum.Fans
Тема

Иногда не удается запустить процесс из PHP-скрипта

Автор: Iskan_Der 18 сообщений 3848 просмотров
#237231

Такая проблема.

Есть сервак с CentOS 5.3. На нем имеется PHP-страничка (под Апачем), запускающая с помощью функции exec разные процессы (команды типа cat и другие скрипты). Беда в том, что иногда (не удалось пока понять, когда именно) вызов exec обламыватся, жалуясь, что он Unable to fork. Как водится, лично у меня все работает, а вот у других пользователей сия ошибка возникает время от времени.

Подскажите, откуда хотя бы начинать копать?

#237503

Хотябы начните с того каким образом php крутится? Модулем или как cgi?

#237504
Iskan Der написал:
откуда хотя бы начинать копать?

может с кода ошибки? с логов?

Planet_Dust написал:
Хотябы начните с того каким образом php крутится? Модулем или как cgi?

+1

#237514
Planet_Dust написал:
Хотябы начните с того каким образом php крутится? Модулем или как cgi?

Пых крутится модулем, в логах апача и в /var/log/messages пока ничего стоящего не заметил. Собственно, кроме скриншота страницы браузера с ошибкой до сих пор нет никаких свидетельств существования проблемы. Начинаю думать, что надо мной неумно шутят :)

#237566
Iskan Der написал:
жалуясь, что он Unable to fork.

ПОЧЕМУ?

Iskan Der написал:
Собственно, кроме скриншота страницы браузера с ошибкой до сих пор нет никаких свидетельств существования проблемы.

распечатайте его, скрутите в трубочку, и засуньте в задницу.

2moderators перенесите тему в разговоры, и создайте там раздел "угадайка". Ну или "для телепатов".

#237600
drBatty написал:
[quote=Iskan Der]жалуясь, что он Unable to fork.

ПОЧЕМУ?[/quote]
Знал бы, вопроса бы не было. Потому и спрашиваю: где копать, на что смотреть? Скажем, выдвигались версии, что достигнут лимит на максимальное количество процессов для пользователя, но нет, не мой случай.

drBatty написал:
распечатайте его, скрутите в трубочку, и засуньте в задницу.

Распечатал, скрутил, подставляйте.

#237771
Iskan Der написал:
Знал бы, вопроса бы не было.

блин У ВАС НА ЭКРАНЕ НАПИСАНО. после Unable to fork. Например может потому, что памяти нет, или ещё по каким-то причинам.

Iskan Der написал:
Распечатал, скрутил, подставляйте.

я-то тут причём? Я читать умею, как не странно. Это вы читать глазами не умеете. Возможно так до вас дойдёт ;)

#237775

Iskan Der, и да, сообщения об ошибках не сообщают об ошибках. ВНЕЗАПНО, они сообщают о причинах ошибки. А unable to fork это как в том анекдоте: "ну не смогла я, не смогла..."

#237811
drBatty написал:
[quote=Iskan Der]Знал бы, вопроса бы не было.

блин У ВАС НА ЭКРАНЕ НАПИСАНО. после Unable to fork. Например может потому, что памяти нет, или ещё по каким-то причинам.[/quote]
Я так на тупого похож? Если бы там было написано что-то в духе "Unable to fork. Do the following to fix this error:...", я бы и без вашей задницы разобрался, что к чему. Или, во всяк, подробнее бы расписал проблему. Однако пых ограничился простым "Unable to fork: <команда>". В роли команды выступают шелловые команды (скажем, tail -n 10 /path/to/file) и запуск скриптов (php /path/to/script).

#237842
Iskan Der написал:
Я так на тупого похож? Если бы там было написано что-то в духе "Unable to fork. Do the following to fix this error:...", я бы и без вашей задницы разобрался, что к чему. Или, во всяк, подробнее бы расписал проблему. Однако пых ограничился простым "Unable to fork: <команда>". В роли команды выступают шелловые команды (скажем, tail -n 10 /path/to/file) и запуск скриптов (php /path/to/script).

ну вот не может выполнится "команда". А почему - известно лишь телепатам, и тому, кто знает, что за "команда".

Iskan Der написал:
Я так на тупого похож?

не на "тупого", а просто на человека, который НИЧЕГО не понимает в Linux. Возможно вы талантливый писатель, или там архитектор. Ибо такое

Iskan Der написал:
команды типа cat и другие скрипты

мог написать только человек, который эту cat видел только на картинках wink

По теме: вот вам мануал: http://php.net/manual/ru/function.exec.php
У любой команды shell имеется код возврата. В случае успеха он равен нулю, в случае неудачи... Потому как сдаётся мне, что это пишет не php модуль, а сама "команда". А "команда" очевидно может писать что угодно.

#238029
drBatty написал:
ну вот не может выполнится "команда". А почему - известно лишь телепатам, и тому, кто знает, что за "команда".

Еще раз медленно: есть скрипт, скрипт иногда не делает то, что должен, а именно не может запустить процесс. Знаю, что это НЕХ, понять, где косяк, не могу, потому спрашиваю: где, помимо логов апача, можно поискать следы этой НЕХ и на что еще следует обратить внимание (настройки безопасности или еще чего)?
Да, на текущем этапе это все похоже на гадание на кофейной гуще, но, увы, подробностей у меня пока нету.

drBatty написал:
не на "тупого", а просто на человека, который НИЧЕГО не понимает в Linux. Возможно вы талантливый писатель, или там архитектор. Ибо такое
[quote=Iskan Der]команды типа cat и другие скрипты

мог написать только человек, который эту cat видел только на картинках wink [/quote]
Кое-чего понимаю (на жизнь хватает), а к словам придираться не надо, я не филолог, мне линух чисто по работе, а не для литературных экзерсисов.

drBatty написал:
У любой команды shell имеется код возврата. В случае успеха он равен нулю, в случае неудачи... Потому как сдаётся мне, что это пишет не php модуль, а сама "команда". А "команда" очевидно может писать что угодно.

Если бы писала сама команда, ее вывод ушел бы в переменную и нормально обработался. "Unable to fork" пишет сам пых, какбэ намекая, что он вообще не может запустить что-либо exec'ом.

#238037
Iskan Der написал:
Еще раз медленно: есть скрипт, скрипт иногда не делает то, что должен, а именно не может запустить процесс. Знаю, что это НЕХ, понять, где косяк, не могу, потому спрашиваю: где, помимо логов апача, можно поискать следы этой НЕХ и на что еще следует обратить внимание (настройки безопасности или еще чего)?
Да, на текущем этапе это все похоже на гадание на кофейной гуще, но, увы, подробностей у меня пока нету.

я вот понять не могу - логов апача тоже нет? чей сервер-то?

Показать
Iskan Der написал:
Кое-чего понимаю (на жизнь хватает), а к словам придираться не надо, я не филолог, мне линух чисто по работе, а не для литературных экзерсисов.

просто это детектор. назовите в автосервисе бензин трансмиссией - цена ремонта поднимется в 10 раз. я вам бесплатно помогаю, потому просто издеваюсь :lol:

Iskan Der написал:
Если бы писала сама команда, ее вывод ушел бы в переменную и нормально обработался. "Unable to fork" пишет сам пых, какбэ намекая, что он вообще не может запустить что-либо exec'ом.

откуда такая уверенность? лично я даже этого пресловутого скрина не видел. ну вы таки видели, вам веры больше. если б cat от скриптов отличать научились. :lol:

#238038

и да, мой опыт подсказывает, что ежели php не может форкнуть, он ещё и пишет ПОЧЕМУ не может. ну раз у вас не пишет, значит это либо фотошоп, либо это команда пишет, либо это глюк RH, либо это НЁХ. И именно в таком порядке. Это вообще говоря не относится (я повторяюсь) к Linux, это тупо логика. Ну не может программист написать сообщение об ошибке "это ошибка", если он не полный даун конечно - ему же ведь свой быдлокод и отлаживать. Потому программист пишет в сообщении "не могу форкнуть, потому-что памяти мало", или типа того. Ну или там "Error 1289453", если он желает, что-бы данную проблему решили только те, кто работает в платной версией и с техподдержкой.

#238216
drBatty написал:
я вот понять не могу - логов апача тоже нет? чей сервер-то?
Iskan Der написал:
в логах апача и в /var/log/messages пока ничего стоящего не заметил

Если нужы подробности, то дословно в логе апаче есть:

text
PHP Warning:  exec() [<a href='function.exec'>function.exec</a>]: Unable to fork [tail -n 10 '/path/to/file'] in /var/www/html/script.php on line 123
Показать
drBatty написал:
просто это детектор. назовите в автосервисе бензин трансмиссией - цена ремонта поднимется в 10 раз. я вам бесплатно помогаю, потому просто издеваюсь :lol:

Я команду cat назвал командой. Она недостаточно команда? Бензин можно звать строго бензином, никак не топливом/горючкой/и т.п.?
Что до вас, то вы пока не помогаете, а только острите тупым концом. Подскажие что-нибудь дельное сначала, а потом можете глумиться, сколько душа пожелает.

drBatty написал:
откуда такая уверенность? лично я даже этого пресловутого скрина не видел. ну вы таки видели, вам веры больше. если б cat от скриптов отличать научились. :lol:

Ну в свои не так уж и мало лет я могу отличить варнинг, выданный пыхом, от собственного вывода. Ну а любителям высокого слога разъясняю доходчиво первый пост: скрипт пытается выполнить некие команды (типа cat) и некие скрипты (под собирательным названием "другие"). Ферштейн?

#238778
Iskan Der написал:

Если нужы подробности, то дословно в логе апаче есть:
text
PHP Warning:  exec() [<a href='function.exec'>function.exec</a>]: Unable to fork [tail -n 10 '/path/to/file'] in /var/www/html/script.php on line 123

Опа! А вот это уже что-то. А ну-ка часть этого скрипта включая как таки пресловую строку 123 выведите сюда. У тя там точно косяк.

P.S. А вообще и правда, почему все еще нет самого скрипта? Нет ни логов, ни конфигов, нифига. Реально, гадание на кофейной гуще.

#238790
Planet_Dust написал:
Опа! А вот это уже что-то. А ну-ка часть этого скрипта включая как таки пресловую строку 123 выведите сюда. У тя там точно косяк.
P.S. А вообще и правда, почему все еще нет самого скрипта? Нет ни логов, ни конфигов, нифига. Реально, гадание на кофейной гуще.

Код имеет вид:

text
function get_content($file_name) {
    $f = escapeshellarg($file_name);
    $cmd = "tail -n 10 $f";
    exec($cmd, $output);
    return implode("\n", $output);
}

ну и потом где-то далее в коде есть наподобие:

text
$content = get_content('/path/to/file');

Скрипт целиком не привожу, ибо:
а) в него вхардкодено много конфиденциального барахла
б) он реально примитивен по сути: выдает обычную форму, по кнопке "Запустить" запускает внешний скрипт через exec, после чего просто показывает кусок лога, в который внешний скрипт пишет.
Про логи уже упоминал, где еще стоит поискать что-нибудь подозрительное?

#381803

Сегодня столкнулся с такой же ошибкой.
Как выяснилось, она явилась следствием того, что apache не смог запустить новый процесс.

В моем случае было:
Количество процессов apache

text

# ps -ef | grep apache | wc -l
1025

Количество процессов разрешенных системой

text

# ulimit -a
max user processes              (-u) 1024

Решение: или уменьшить maxclients в apache или увеличить max user processes для виртуалки.

#382233

"happyblitz" написал:
Количество процессов разрешенных системой
кстати вам на будущее: команда bash ulimit рута лишь по случайному совпадению совпала с тем, что выставлено в конфиге апача (это значение устанавливается системной функцией ulimit(3) из glibc)

И AFAIK причину оно таки пишет в логе.
Войдите или зарегистрируйтесь, чтобы ответить.