周一刚上班就接到Windchill业务管理员的电话,说Windchill应用现在无法使用,重启了应用也没效果。因为是生产环境,情况比较紧急。上周日应用人员做的唯一改动就是做data load(分类搜索无法使用),但据反映data load做了7,8个小时也没结果,系统也没有抛错。之后应用人员就让这个操作放在后台跑没有去管它了。
进入应用所在的OS,查看文件系统空间。发现应用所在的文件系统空间满了,问题似乎有了进展。找到这个文件系统下占用空间较大的排名靠前的目录。最后找到一个logs目录,进入目录找到一个20几G的日志文件。删除日志后重启系统,还是不行。仔细检查启动日志发现apache启动报错:
#./apachectl start
(20014)Error string not specified yet: Error retrieving pid file logs/httpd.pid
ps一下httpd进程真的是没有起来,页面当然也是打不开了。在apache目录下定位到httpd.pid这个文件,跟测试机的比较了一下。权限,属主什么的都相同,唯一不同的是文件大小。查看文件内容发现生产环境的这个文件是空的。测试环境的这个文件有个数字(我猜测这个就是PID)。
到网上找了些apache的资料,发现apache启动的时候要读取这个httpd.pid文件。httpd.pid这个文件固定了apache的进程状态,httpd.pid文件的内容其实就是apache在服务器中的pid进程号,apache每次启动都会有获得一个不同的pid号,然后把这个pid写入httpd.pid文件,进程间通信就以这个pid进行。apache在启动后,保持这个pid值不变,直到下次重新启动apache。
好了,既然是这么回事我可以往这个文件里也写一个进程号。但是为了不和现有生产环境的PID同名,我尝试改名这个文件(相当于删除),然后重启apache。结果apache能正常启动,ps一下进程:
#ps -ef|grep httpd
nobody 217118 172584 0 09:04:14 - 0:35 /ptc/apache/bin/httpd -d /ptc/apache -k start
nobody 311704 172584 0 09:04:14 - 0:00 /ptc/apache/bin/httpd -d /ptc/apache -k start
nobody 78544 172584 0 09:04:14 - 0:33 /ptc/apache/bin/httpd -d /ptc/apache -k start
root 172584 1 0 09:04:14 - 0:00 /ptc/apache/bin/httpd -d /ptc/apache -k start
注意我标红色pid跟httpd.pid的文件内容是一样的。
#cat httpd.pid
172584
后来在测试机上进一步实验发现:如果在apache启动好的情况下(httpd进程运行正常),如果你将httpd.pid文件清空,这时是无法关闭apache的。报错信息跟上面一样:
(20014)Error string not specified yet: Error retrieving pid file logs/httpd.pid
如果你正常的关闭apache,httpd.pid这个文件会自动消失,启动后会自动创建,并把apache的进程号写入这个文件。
如果关闭apache后我手工创建httpd.pid这样一个文件,并写入内容123456,apache启动后会发生什么现象呢?#cat httpd.pid
123456
#./apachectl start
#ps -ef|grep httpd
nobody 970770 1118328 0 10:26:39 - 0:00 /ptc/apache/bin/httpd -d /ptc/apache -k start
nobody 1093734 1118328 0 10:26:38 - 0:00 /ptc/apache/bin/httpd -d /ptc/apache -k start
root 1118328 1 0 10:26:38 - 0:00 /ptc/apache/bin/httpd -d /ptc/apache -k start
nobody 1122374 1118328 0 10:26:39 - 0:00 /ptc/apache/bin/httpd -d /ptc/apache -k start
httpd的进程并不是我指定的123456,而是1118328.现在查看httpd.pid文件的内容:
#cat httpd.pid
1118328
问题讨论到这,使我们对httpd.pid文件在apache中的作用有了全面的了解。关于引起这个问题的原因,我想可能是这样的:
日志暴涨:data load的时候发生异常,导致日志疯长。
httpd.pid文件为空:反复重启应用的时候,apache不能正常关闭(httpd.pid文件为空,可能是文件系统满导致的异常。),但启动关闭脚本里有强行杀httpd进程的语句,这样导致httpd进程强行结束了,但httpd.pid这个空文件依然存在。
阅读(2860) | 评论(0) | 转发(0) |