nagios --自定义python插件cx_Oracle监控Oracle问题
本帖最后由 ontherd 于 2014-04-21 11:11 编辑Hi,
我在Nagios软件上调用自定义插件Python监控Oracle,报错Traceback (most recent call last):
File "/usr/local/nagios/libexec/check_oracle_jobs.py", line 11, in <module>
import cx_Oracle
ImportError: libclntsh.so.11.1: cannot open shared object file: No such file or directory但是我在nagios用户手动调用自定义插件却运行正常,$ ./check_oracle_jobs.py 10.68.2.21 orcl 123456 orcl 4
Critical - User:orcl job:362 is breken.|ora_broken_jobs=4;;;0我的系统环境变量配置,$ more /etc/profile
export ORACLE_HOME="/usr/local/instantclient_11_2"
export PATH=$PATH:$ORACLE_HOME
export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"
export TNS_ADMIN=$ORACLE_HOME
export LD_LIBRARY_PATH=$ORACLE_HOME:$LD_LIBRARY_PATH
export SQLPATH=$ORACLE_HOME
alias sqlplus="$ORACLE_HOME/sqlplus"我的Nagios里配置文件command.cfg配置如下,
define command {
command_name check_ora_table
command_line $USER1$/check_oracle_table.py $HOSTADDRESS$ orcl 123456 orcl $ARG1$$ARG2$$ARG3$ $ARG4$
register 1
}下面是我写的python在监控Oracle数据库jobs的脚本,#! /usr/bin/env python
##################################################
#-*- conding: utf-8 -*-
#Function: check oracle jobs broken
#Usage: python check_oracle_jobs.py
#Author: Ontherd
#Company:
#Version: 1.2
##################################################
import cx_Oracle
import sys
import re
OK = 0
WARNING = 1
CRITICAL = 2
class InputCheck(object):
def check_input(self):
if len(sys.argv) != 6 :
print "Error: the number of input parameters error."
print "Usage: python %s ip login password oracle_sid jobs_broken_number" % sys.argv
sys.exit()
class Cx_Oracle(object):
def __init__(self, host, user, password, sid, sql, critical):
self.host = host
self.user = user
self.password = password
self.sid = sid
self.sql = sql
self.critical = critical
def ConnectOracle(self):
dsn_tns = cx_Oracle.makedsn(self.host, 1521, self.sid)
try :
conn = cx_Oracle.connect(self.user, self.password, dsn_tns)
except Exception, e :
print 'connect error: ',e
sys.exit()
return conn
def check_jobs(self):
out_list = []
db = self.ConnectOracle()
cursor = db.cursor()
cmd_result = cursor.execute(self.sql)
list = cmd_result.fetchall()
for l in list:
out_list.append("".join(l))
list_length = len(out_list)
# Show Nagios
iflist_length <= self.critical :
print "OK - All the normal jobs."
sys.exit(OK)
else :
print "Critical - %s is breken.|ora_broken_jobs=%d;;;0" % (','.join(out_list), list_length)
sys.exit(CRITICAL)
cursor.close()
db.close()
if __name__ == '__main__' :
chkinput = InputCheck()
chkinput.check_input()
host = sys.argv
user = sys.argv
password = sys.argv
sid = sys.argv
critical = int(sys.argv)
sql = "select 'User:'||schema_user||' '||'job:'||job from dba_jobs where broken = 'Y'"
ora = Cx_Oracle(host, user, password, sid, sql, critical)
ora.check_jobs()
大家有没有遇到和我同样的问题,请各位大牛帮忙指点迷津。 nagios用户,在shell手动可以,自动是用cron?看上去是dll没找到,可能是环境变量的问题。
回复 1# ontherd
多谢大家关注,
自测出结果来了。
运行脚本包libclntsh.so.11.1这个动态链接库找不到。
动态连接库默认读取这个/etc/ld.so.conf文件,即默认/lib /usr/lib文件夹下的文件。
而我的Oracle简易客户端是安装在/usr/local/instantclient_11_2这个路径下。
所以我的操作步骤:
]# vi /etc/ld.so.conf 追加内容
/usr/local/instantclient_11_2
]# ldconfig
]# ldconfig -p | grep 'libclntsh.so.11.1' 测试是否能查询到,如果能查询到就OK了。
页:
[1]