<div dir="ltr"><div><div><div><div>давайте разбираться. если запускать nginx в консоли (это штатный режим, так работают назначенные задания), то завершение задания с точки зрения мастер-процесса выглядит, как CTRL_CLOSE_EVENT в функции-обработчике ngx_console_handler<br>
<br></div>worker-процесс в это время залипает в функции ngx_worker_process_cycle в цикле "ev=WaitForMultipleObjects()"<br><br></div>соответственно, закрытие мастера путем закрывания не приводит к тому, что в данном месте возникает какое-то событие.<br>
<br></div>варианты - либо существенно переделывать логику и протаскивать сюда еще одно событие, либо жестко закрыть worker через ngx_terminate_worker_processes.<br><br></div>чем чреват второй вариант ? ну ок, закроются текущие сессии. завершая задание, мы, вероятно, этого и добиваемся.<br>
</div><div class="gmail_extra"><br><br><div class="gmail_quote">26 марта 2013 г., 17:27 пользователь 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><div class="h5"><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>
> остается запущенный worker-процесс.<br>
><br>
> насколько я понял, в случае Windows это штатная ситуация (при такой работе<br>
> с процессами, которая используется в nginx), для исправления предлагаю<br>
> такой патч (сделан для 1.3.14):<br>
><br>
> --- src/os/win32/ngx_process_cycle.c    2013-03-26 16:57:20.000000000 +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>
</div></div>Звать ngx_terminate_worker_processes() - это не очень хорошая<br>
идея, это всё-таки аварийный механизм, и может приводить к<br>
нехорошему.  Тут имеет смысл как минимум попытаться штатно<br>
завершить рабочие процессы.<br>
<span class="HOEnZb"><font color="#888888"><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></font></span></blockquote></div><br></div>