首页 > 代码库 > Apache服务启动失败couldn't start errorlog process, unable to open logs

Apache服务启动失败couldn't start errorlog process, unable to open logs

在某用户环境下,Apache服务启动失败,报错信息如下

couldn‘t start errorlog process

 unable to open logs

Apache是我们的产品组件,未防止日志过大

我们使用了Apache自带的切割滚存日志的组件rotatelogs.exe

在httpd.conf配置如下:

ErrorLog "|bin/rotatelogs.exe logs/%Y%m%d%H%M%S_error.log 30M"

只要屏蔽这个设置,就可以正常启动Apache,谷歌了下,有人说这是Apache已知BUG,

但是连续两个用户反馈这个问题,找了个可以远程的环境定位了下问题:

居然是因为环境变量的问题

定位过程如下:

1>确认rotatelogs.exe本身可以执行,

2>按网上的说法尝试把bin/rotatelogs.exe改为全路径,不生效

3>上工具,ProcMon,筛选了进程映像名保含“rotatelogs.exe”,无任何发现

4>感觉不对劲,加上“httpd.exe”筛选,也没看出什么毛病

5>重置ProcMon的Filter,再启动httpd.exe

结果发现c:\windows\system32\cmd.exe NOT FOUND

用户的系统盘是D盘,C盘系统目录没有cmd.exe,于是在c:\windows\system32目录下放了个cmd.exe,

果然可以启动服务,原来如此!!!!!!!


暂停尝试,翻了下 Apache的代码,搜了下“couldn‘t start errorlog process”

最终找到

    i = strlen(progname);
        if (i >= 4 && (strcasecmp(progname + i - 4, ".bat") == 0
                    || strcasecmp(progname + i - 4, ".cmd") == 0))
        {
            char *shellcmd = getenv("COMSPEC");
            if (!shellcmd) {
                if (attr->errfn) {
                    attr->errfn(pool, APR_EINVAL, "COMSPEC envar is not set");
                }
                return APR_EINVAL;
            }

原来是读的环境变量,

把用户的环境变量COMSPEC纠正过来就OK了


反思:

这个过程中我忽略了个细节,Apache是通过cmd.exe调用rotatelogs.exe的,这个我之前是知道的,但是终究没有跟Apache的报错日志联系在一起




Apache服务启动失败couldn't start errorlog process, unable to open logs