<div dir="ltr">если банальный ngx_msleep(1000) действительно решит проблемы - мне непринципиально, пусть будет так.<br>поправите код ?<br></div><div class="gmail_extra"><br><br><div class="gmail_quote">27 марта 2013 г., 18:20 пользователь Maxim Dounin <span dir="ltr"><<a href="mailto:mdounin@mdounin.ru" target="_blank">mdounin@mdounin.ru</a>></span> написал:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello!<br>
<div class="im"><br>
On Wed, Mar 27, 2013 at 09:58:07AM +0600, Илья Шипицин wrote:<br>
<br>
> вот такой вариант ?<br>
><br>
> --- src/os/win32/ngx_process_cycle.c.orig       2013-03-27<br>
> 09:53:48.000000000 +0600<br>
> +++ src/os/win32/ngx_process_cycle.c    2013-03-27 09:48:56.000000000 +0600<br>
> @@ -303,6 +303,8 @@<br>
>  ngx_console_handler(u_long type)<br>
>  {<br>
>      char  *msg;<br>
> +       ngx_cycle_t     *cycle;<br>
> +       cycle = (ngx_cycle_t *) ngx_cycle;<br>
><br>
>      switch (type) {<br>
><br>
> @@ -316,6 +318,8 @@<br>
><br>
>      case CTRL_CLOSE_EVENT:<br>
>          msg = "console closing, exiting";<br>
> +               ngx_quit = 1;<br>
> +        ngx_quit_worker_processes(cycle, 0);<br>
>          break;<br>
><br>
>      case CTRL_LOGOFF_EVENT:<br>
<br>
</div>Я пересморел этот код ещё раз, перечитал соответствующую виндовую<br>
документацию, и склонен думать, что:<br>
<br>
1) Патч, меняющий обработку только в случае CTRL_CLOSE_EVENT -<br>
заведомое неправильный, т.к. все случаи с точки зрения системы и<br>
nginx'а - равнозначны.  (Прозвучавшее тут утверждение, что по<br>
Ctrl-C воркеры закрываются - видимо основано на наблюдениях за<br>
отдельными случаями, когда везло.  Текущее поведение - содержит в<br>
себе race, см. ниже, и может иногда работать правильно.)<br>
<br>
2) Текущая обработка - правильная, за одним небольшим упущением:<br>
нужно дожидаться завершения процесса до собственно возврата из<br>
ngx_console_handler(), потому что после возврата - процесс<br>
завершат, и сделанная нами попытка запустить процедуру штатной<br>
остановки - скорее всего пропадёт впустую.  Что, собственно, и<br>
происходит.<br>
<br>
IMHO, правильным решением будет добавить ожидание перед возвратом<br>
из ngx_console_handler().  В качетсве грубого хака - можно<br>
попробовать воткнуть туда банальный ngx_msleep(1000), должно<br>
помочь.<br>
<div class="HOEnZb"><div class="h5"><br>
><br>
><br>
><br>
><br>
><br>
><br>
> 26 марта 2013 г., 18:08 пользователь Maxim Dounin <<a href="mailto:mdounin@mdounin.ru">mdounin@mdounin.ru</a>>написал:<br>
><br>
> > Hello!<br>
> ><br>
> > On Tue, Mar 26, 2013 at 05:43:21PM +0600, Илья Шипицин wrote:<br>
> ><br>
> > > давайте разбираться. если запускать nginx в консоли (это штатный режим,<br>
> > так<br>
> > > работают назначенные задания), то завершение задания с точки зрения<br>
> > > мастер-процесса выглядит, как CTRL_CLOSE_EVENT в функции-обработчике<br>
> > > ngx_console_handler<br>
> > ><br>
> > > worker-процесс в это время залипает в функции ngx_worker_process_cycle в<br>
> > > цикле "ev=WaitForMultipleObjects()"<br>
> > ><br>
> > > соответственно, закрытие мастера путем закрывания не приводит к тому,<br>
> > что в<br>
> > > данном месте возникает какое-то событие.<br>
> ><br>
> > То, что это плохо - вопросов не вызывает.  По Ctrl-C всё должно<br>
> > штатно закрываться, а не висеть вечно.<br>
> ><br>
> > > варианты - либо существенно переделывать логику и протаскивать сюда еще<br>
> > > одно событие, либо жестко закрыть worker через<br>
> > > ngx_terminate_worker_processes.<br>
> > ><br>
> > > чем чреват второй вариант ? ну ок, закроются текущие сессии. завершая<br>
> > > задание, мы, вероятно, этого и добиваемся.<br>
> ><br>
> > Например, могут остаться полусохранённые файлы в кеше/proxy_store -<br>
> > если рабочий процесс прервали в процессе копирования временного<br>
> > файла в целевой каталог.<br>
> ><br>
> > (Документация по TerminateProcess() и различные code<br>
> > checker'ы любят пугать про "the state of global data maintained<br>
> > by dynamic-link libraries (DLLs) may be compromised".  Но это,<br>
> > насколько я понимаю, в данном случае к nginx'у неприменимо - по<br>
> > крайней мере, в отсутствии сторонних модулей.)<br>
> ><br>
> > ><br>
> > ><br>
> > > 26 марта 2013 г., 17:27 пользователь Maxim Dounin <<a href="mailto:mdounin@mdounin.ru">mdounin@mdounin.ru</a><br>
> > >написал:<br>
> > ><br>
> > > > Hello!<br>
> > > ><br>
> > > > On Tue, Mar 26, 2013 at 05:03:30PM +0600, Илья Шипицин wrote:<br>
> > > ><br>
> > > > > Добрый день!<br>
> > > > ><br>
> > > > > мы достаточно плотно используем nginx для Windows, запускаем его<br>
> > через<br>
> > > > > назначенное задание (scheduled tasks). Для этого в конфиге надо<br>
> > сделать<br>
> > > > > "daemon off" и дальше менеджер заданий следит за мастер-процессом,<br>
> > > > > запущенным на терминале.<br>
> > > > ><br>
> > > > > это, кстати, удобнее, чем служба Windows (вообще, назначенные задания<br>
> > > > более<br>
> > > > > удобны и мы чаще используем их, чем службы).<br>
> > > > ><br>
> > > > > в этом сценарии есть один недостаток, при завершении мастер-процесса,<br>
> > > > > остается запущенный worker-процесс.<br>
> > > > ><br>
> > > > > насколько я понял, в случае Windows это штатная ситуация (при такой<br>
> > > > работе<br>
> > > > > с процессами, которая используется в nginx), для исправления<br>
> > предлагаю<br>
> > > > > такой патч (сделан для 1.3.14):<br>
> > > > ><br>
> > > > > --- src/os/win32/ngx_process_cycle.c    2013-03-26 16:57:20.000000000<br>
> > > > +0600<br>
> > > > > +++ src/os/win32/ngx_process_cycle.c.new        2013-03-26<br>
> > > > > 16:57:00.987341331 +0600<br>
> > > > > @@ -303,6 +303,8 @@<br>
> > > > >  ngx_console_handler(u_long type)<br>
> > > > >  {<br>
> > > > >      char  *msg;<br>
> > > > > +       ngx_cycle_t       *cycle;<br>
> > > > > +    cycle = (ngx_cycle_t *) ngx_cycle;<br>
> > > > ><br>
> > > > >      switch (type) {<br>
> > > > ><br>
> > > > > @@ -316,6 +318,7 @@<br>
> > > > ><br>
> > > > >      case CTRL_CLOSE_EVENT:<br>
> > > > >          msg = "console closing, exiting";<br>
> > > > > +               ngx_terminate_worker_processes(cycle);<br>
> > > > >          break;<br>
> > > > ><br>
> > > > >      case CTRL_LOGOFF_EVENT:<br>
> > > ><br>
> > > > Звать ngx_terminate_worker_processes() - это не очень хорошая<br>
> > > > идея, это всё-таки аварийный механизм, и может приводить к<br>
> > > > нехорошему.  Тут имеет смысл как минимум попытаться штатно<br>
> > > > завершить рабочие процессы.<br>
> > > ><br>
> > > > --<br>
> > > > Maxim Dounin<br>
> > > > <a href="http://nginx.org/en/donation.html" target="_blank">http://nginx.org/en/donation.html</a><br>
> > > ><br>
> > > > _______________________________________________<br>
> > > > nginx-ru mailing list<br>
> > > > <a href="mailto:nginx-ru@nginx.org">nginx-ru@nginx.org</a><br>
> > > > <a href="http://mailman.nginx.org/mailman/listinfo/nginx-ru" target="_blank">http://mailman.nginx.org/mailman/listinfo/nginx-ru</a><br>
> ><br>
> > > _______________________________________________<br>
> > > nginx-ru mailing list<br>
> > > <a href="mailto:nginx-ru@nginx.org">nginx-ru@nginx.org</a><br>
> > > <a href="http://mailman.nginx.org/mailman/listinfo/nginx-ru" target="_blank">http://mailman.nginx.org/mailman/listinfo/nginx-ru</a><br>
> ><br>
> ><br>
> > --<br>
> > Maxim Dounin<br>
> > <a href="http://nginx.org/en/donation.html" target="_blank">http://nginx.org/en/donation.html</a><br>
> ><br>
> > _______________________________________________<br>
> > nginx-ru mailing list<br>
> > <a href="mailto:nginx-ru@nginx.org">nginx-ru@nginx.org</a><br>
> > <a href="http://mailman.nginx.org/mailman/listinfo/nginx-ru" target="_blank">http://mailman.nginx.org/mailman/listinfo/nginx-ru</a><br>
> ><br>
<br>
> _______________________________________________<br>
> nginx-ru mailing list<br>
> <a href="mailto:nginx-ru@nginx.org">nginx-ru@nginx.org</a><br>
> <a href="http://mailman.nginx.org/mailman/listinfo/nginx-ru" target="_blank">http://mailman.nginx.org/mailman/listinfo/nginx-ru</a><br>
<br>
<br>
--<br>
Maxim Dounin<br>
<a href="http://nginx.org/en/donation.html" target="_blank">http://nginx.org/en/donation.html</a><br>
<br>
_______________________________________________<br>
nginx-ru mailing list<br>
<a href="mailto:nginx-ru@nginx.org">nginx-ru@nginx.org</a><br>
<a href="http://mailman.nginx.org/mailman/listinfo/nginx-ru" target="_blank">http://mailman.nginx.org/mailman/listinfo/nginx-ru</a></div></div></blockquote></div><br></div>