mod_perl and waitpid() failed (10: No child processes)

Maxim Dounin mdounin на mdounin.ru
Пт Мар 12 15:13:30 MSK 2010


Hello!

On Fri, Mar 12, 2010 at 01:04:21PM +0200, Vasil Mikhalenya wrote:

> Приветствую,
> 
> Т.к. ответа на письмо в
> рассылку<http://forum.nginx.org/read.php?21,60474,60474>я не получил,
> нашел единственный способ реализовать данный функционал -
> используя mod_perl.
> И все вроде бы получилось, обработку исключительных ситуаций оставил на
> потом, и когда пришло это "потом", с ужасом обнаружил что не могу обработать
> код ответа порожденного процесса.
> 
> в перл модуле это следующий код:
> 
> if ( (system("wget $uri -O '$path' > /dev/null 2>&1") ) or ( system("mogrify
> -resize $size '$path' > /dev/null 2>&1") ) ) {
> 
> в логе такое
> 
> ==> error.log <==
> 2010/03/12 13:02:53 [notice] 10842#0: signal 17 (SIGCHLD) received
> 2010/03/12 13:02:53 [alert] 10842#0: waitpid() failed (10: No child
> processes)
> 
> Видел что подобная тема поднималась в рассылке, но в чем проблема так и не
> понял. Использовать Mechanize не предлагайте, работает гораздо дольше
> wget'а.
> Поясните почему нельзя или как можно получить код возврата процесса.

Нельзя потому что код блокируется, а значит блокирует весь рабочий 
процесс nginx'а.

Ну а то что наблюдается - это ерунда.  Просто 
SIGCHLD по завершению порождённого вами процесса попал в 
стандартный обработчик nginx'а, а он на это не расчитан.

Используйте встроенный перл для подсчёта md5, а 
выкачку/сохранение/resize делайте с помощью 
proxy_pass/proxy_store/image_filter соответственно.

Maxim Dounin



Подробная информация о списке рассылки nginx-ru