首页 > 代码库 > 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