我们这个平台使用的是HP的小机rx6600,因为跑java程序,所以选用了oracle公司的oc4j这个中间件,顺便吐槽一下,这个oc4j真的太麻烦,太讨厌了,搞不懂公司当初在实施的时候,为什么不采用weblogic或者是websphere这类的中间件。

前几天因为服务器双机出现故障,硬件厂家来了工程师处理好了双机问题。我这边因为修正了一个接口地址,本想重启应用,可应用死活启动不了。

故障一:

故障现象:

control.sh.log内容,报如下错误:

opmnctl: starting opmn and all managed processes...  
RCV: Permission denied  
Communication error with the OPMN server local port.  
Check the OPMN log files  

之后打开opmn.log,查看日志内容,发现如下错误:

12/11/16 19:22:14 [ons-internal] ONS server initiated
12/11/16 19:22:14 [pm-internal] PM state directory exists: /oracle/oracle10g/product/10.1.3.1/OracleAS_1/opmn/logs/states
12/11/16 19:22:14 [pm-internal] OPMN server ready. Request handling enabled.
12/11/16 19:22:14 [ons-listener] 127.0.0.1,6100: BIND (Address already in use)
12/11/16 19:22:14 [ons-connect] Local connection 127.0.0.1,6100 invalid form factor<unknown>  


从日志可以看出,ons监听器无法绑定地址到本地的6100端口,经过查询OTN,发现应该是opmn进程没有退出,导致ons监听器启动不了。

解决办法:

1.在双机未启动的情况下,查看opmn进程是否存在:

ps -ef|grep 'opmn -d'|grep -v 'grep'

2.若存在进程,注意一下进程的所属用户,并且使用kill -9杀掉这个进程:

kill -9 <PID>

3.查看.formfactor的权限和属主,若不正确使用相应的命令处理:

$ cd $ORACLE_HOME/opmn/conf
$ ls -ld1 .*
 drwx------ 3 oracle oinstall 4096 Sep 7 09:08 .
 drwx------ 8 oracle oinstall 4096 May 30 09:00 ..
 -r-------- 1 root root 21 Sep 7 09:08 .formfactor
$ chown oracle:oinstall .formfactor

4.启动双机,检查应用是否启动。

PS:出现这种故障的情况,是因为opmn进程可能以其他用户启动的,而正确的属主用户无法停止,如本例中是oracle用户。还有就是.formfactor的权限问题,也要注意。

故障二:

故障现象:

在control.sh.log中,看到如下错误:

Error  
-->Process (index=1,uid=528,pid=3990)
failed to start a managed process after the maximum retry limit

Log:  
/oracle/oracle10g/product/10.1.3.1/OracleAS_1/opmn/logs//HTTP_Server~1.log
logout  
ERROR: Function customer_defined_run_cmds  
ERROR: Failed to RUN customer commands  

查看opmn.log,发现如下问题:

gstas.gstasap1~default_group~home~default_group~527:3797  
Status: Stop  
Operation: request (time out while waiting for a managed process to stop)  
ErrFile: /oracle/oracle10g/product/10.1.3.1/OracleAS_1/opmn/logs//default_group~home~default_group~1.log  

之后查看HTTP_Server~1.log,发现非常多的startssl信息:

--------
12/11/20 20:50:22 Start process  
--------
/oracle/oracle10g/product/10.1.3.1/OracleAS_1/Apache/Apache/bin/apachectl startssl: execing httpd

--------
12/11/20 20:50:32 Start process  
--------
/oracle/oracle10g/product/10.1.3.1/OracleAS_1/Apache/Apache/bin/apachectl startssl: execing httpd

解决方案:

起初我以为是oc4j中的apache配置文件出现了问题,于是在opmn.xml中禁用了SSL,但是故障现象依旧出现,我将修改过的opmn.xml还原回去,然后继续查,发现httpd.pid文件的属主不正确,竟然属于root用户,这明显有问题,应该是属于oracle用户的,于是我找到这个httpd.pid文件,将其mv至其他目录,重启应用,yeah,应用正常启动了。

总结:

在生产环境中,出现应用启动失败的情况,一点都不可怕,而且也请不要慌张,所有错误都是有迹可循的,仔细查看日志,分析错误原因,就能找到正确的解决办法,当然,找到问题却解决不了的时候,也还是可以google的。呵呵。oc4j的几个重要日志一定要注意:

1.opmn的日志:

/oracle/oracle10g/product/10.1.3.1/OracleAS_1/opmn/logs/opmn.log

2.apache的日志:

/oracle/oracle10g/product/10.1.3.1/OracleAS_1/Apache/Apache/logs

3.双机cmcluster的控制脚本的日志:

/etc/cmcluster/app_pkg[应用名]/control.sh.log

4.你的java应用的日志.