Hello!
On Thu, Jan 24, 2013 at 11:11 PM, Wenhua Zhang wrote:
> 请教您一个nginx无缝升级的问题。
> 为了实现nginx版本的升级,对旧的PID发送“USR2”信号,但nginx的进程没有响应,并没有产生新的nginx进程。
>
> error log中有如下信息:
> 2013/01/25 14:22:46 [alert] 9635#0: execve() failed while executing
> new binary process "nginx" (2: No such file or directory)
>
这条错误消息解释了原因。
因为你的 nginx 老实例没有使用绝对路径启动,而是从 PATH 环境变量查找的,所以 Nginx 在接收到 USR2 信号时使用
execve() 执行原 Nginx 启动命令行的第一个参数启动新实例时就会报找不到 nginx 可执行文件的错误(而 execve()
并不会查找 PATH 环境变量)。
一般地,应当总是使用绝对路径来启动 nginx,以避免不必要的麻烦,即类似
$ /usr/sbin/nginx -c conf/nginx.conf
这种形式。
这个问题在 Nginx 俄语邮件列表中也有人遇到过:
http://mailman.nginx.org/pipermail/nginx-ru/2008-June/018239.html
值得一提的是,对于这个问题,查看 nginx 错误日志或者使用 strace 追踪系统调用都比使用 systemtap 要更直接更容易一些 :)
Best regards,
-agentzh
P.S. 同时抄送给 openresty 中文邮件列表:http://openresty.org/#Community