<div dir="ltr"><div>по Ctrl-C воркеры закрываются. в назначенных заданиях, насколько я понял, не отправляется Ctrl-C, а закрывается stdin.<br><br></div>ок, замечания понятны. поправлю.<br></div><div class="gmail_extra"><br>
<br><div class="gmail_quote">26 марта 2013 г., 18:08 пользователь 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 Tue, Mar 26, 2013 at 05:43:21PM +0600, Илья Шипицин wrote:<br>
<br>
> давайте разбираться. если запускать nginx в консоли (это штатный режим, так<br>
> работают назначенные задания), то завершение задания с точки зрения<br>
> мастер-процесса выглядит, как CTRL_CLOSE_EVENT в функции-обработчике<br>
> ngx_console_handler<br>
><br>
> worker-процесс в это время залипает в функции ngx_worker_process_cycle в<br>
> цикле "ev=WaitForMultipleObjects()"<br>
><br>
> соответственно, закрытие мастера путем закрывания не приводит к тому, что в<br>
> данном месте возникает какое-то событие.<br>
<br>
</div>То, что это плохо - вопросов не вызывает.  По Ctrl-C всё должно<br>
штатно закрываться, а не висеть вечно.<br>
<div class="im"><br>
> варианты - либо существенно переделывать логику и протаскивать сюда еще<br>
> одно событие, либо жестко закрыть worker через<br>
> ngx_terminate_worker_processes.<br>
><br>
> чем чреват второй вариант ? ну ок, закроются текущие сессии. завершая<br>
> задание, мы, вероятно, этого и добиваемся.<br>
<br>
</div>Например, могут остаться полусохранённые файлы в кеше/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>
<div class="HOEnZb"><div class="h5"><br>
><br>
><br>
> 26 марта 2013 г., 17:27 пользователь Maxim Dounin <<a href="mailto:mdounin@mdounin.ru">mdounin@mdounin.ru</a>>написал:<br>
><br>
> > Hello!<br>
> ><br>
> > On Tue, Mar 26, 2013 at 05:03:30PM +0600, Илья Шипицин wrote:<br>
> ><br>
> > > Добрый день!<br>
> > ><br>
> > > мы достаточно плотно используем nginx для Windows, запускаем его через<br>
> > > назначенное задание (scheduled tasks). Для этого в конфиге надо сделать<br>
> > > "daemon off" и дальше менеджер заданий следит за мастер-процессом,<br>
> > > запущенным на терминале.<br>
> > ><br>
> > > это, кстати, удобнее, чем служба Windows (вообще, назначенные задания<br>
> > более<br>
> > > удобны и мы чаще используем их, чем службы).<br>
> > ><br>
> > > в этом сценарии есть один недостаток, при завершении мастер-процесса,<br>
> > > остается запущенный worker-процесс.<br>
> > ><br>
> > > насколько я понял, в случае Windows это штатная ситуация (при такой<br>
> > работе<br>
> > > с процессами, которая используется в nginx), для исправления предлагаю<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></div></div></blockquote></div><br></div>