em agent emctl upload报OMS version not checked yet错

本文提供了解决 Oracle EM Grid Control 11g 中 Agent 无法工作的详细步骤,包括使用 SQL 函数清理 Agent、手动清除相关文件及重新配置 Agent 的全过程。

Oracle EM grid control 11g 安装完成后,在一个监控服务器上重装 agent 一下, agent 就不能工作了。

使用 emctl upload 检查时报错为 ”EMD upload error: uploadXMLFiles skipped” 。如下所示:

 

[oracle@codb2 ~]$ emctl upload

Oracle Enterprise Manager 11g Release 1 Grid Control 11.1.0.1.0

Copyright (c) 1996, 2010 Oracle Corporation.    All rights reserved.

---------------------------------------------------------------

EMD upload error: uploadXMLFiles skipped :: OMS version not checked yet. If this issue persists check trace files for ping to OMS related errors.

 

 

这是 Oracle EM Grid Control 11g 安装指导 一文中介绍的安装 EM GRID CONTROL 11G 结束后,配置 agent 时出现的问题。如果你需要知道如何去安装配置 grid control 11g ,请参考此文。

miki 西游的文档 , 原文链接 : http://mikixiyou.iteye.com/blog/1545847 ,转载请著名作者和出处)

 

这个问题如何解决呢?

 

首先,我在监控服务器上,也就是 codb2 服务器上使用 emctl verifykey 校验一下。发现是 OMS 将这个 agent block 了。

[oracle@codb2 ~]$ emctl verifykey

Oracle Enterprise Manager 11g Release 1 Grid Control 11.1.0.1.0

Copyright (c) 1996, 2010 Oracle Corporation.    All rights reserved.

 

-----------------------------------------------------

verifykey: Successfully Completed communication with agent

EMD pingOMS error: Invalid ping response "ERROR-Agent is blocked. Blocked reason is: Agent is out-of-sync with repository. This most likely means that the agent was reinstalled or recovered. Please contact an EM administrator to unblock the agent by performing an agent resync from the console. Please contact EM adminstrator to unblock the agent"

那么,我就去 OEM grid control 11g 的控制台上去解决这个 block

在控制台主目录中,选择未知的对象,代理重新同步,不成功。报错如下:

代理操作已完成 ,   但出现错误。对于那些无法保存的目标 ,   请转至目标的监视配置页以保存它们。已成功保存所有其他目标。仍未取消阻止代理。

与代理通信时出错。异常错误消息   - oracle.sysman.emSDK.emd.comm.CommException: IOException in reading Response :: Connection reset “

在界面操作上没办法去取消这个代理了。于是乎,我们登录 grid control 的资料库中,去直接修改配置信息。

使用函数 mgmt_admin.cleanup_agent('host:port');   去清理这个 agent

参数 host port 的值从监控端服务器中使用 emctl status agent 输出信息中取得。

详细信息如下:

 

[oracle@codb1 ~]$ emctl status agent

Oracle Enterprise Manager 11g Release 1 Grid Control 11.1.0.1.0

Copyright (c) 1996, 2010 Oracle Corporation.    All rights reserved.

---------------------------------------------------------------

Agent Version       : 11.1.0.1.0

OMS Version         : 11.1.0.1.0

Protocol Version    : 11.1.0.0.0

Agent Home          : /u01/app/oracle/product/10.2.0/oms/agent11g/codb1.xxyy.com.cn

Agent binaries      : /u01/app/oracle/product/10.2.0/oms/agent11g

Agent Process ID    : 21727

Parent Process ID : 21673

Agent URL           : https://codb1.xxyy.com.cn:3872/emd/main

Repository URL      : https://htwebapp1:4900/em/upload

Started at          : 2012-05-31 15:54:52

Started by user     : oracle

Last Reload         : 2012-05-31 16:05:04

Last successful upload                         : 2012-05-31 16:10:07

Total Megabytes of XML files uploaded so far :       0.39

Number of XML files pending upload             :          0

Size of XML files pending upload(MB)           :       0.00

Available disk space on upload filesystem      :      44.51%

Last successful heartbeat to OMS               : 2012-05-31 16:22:05

---------------------------------------------------------------

Agent is Running and Ready

 

请注意这一行

Agent URL           :https://codb1.xxyy.com.cn:3872/emd/main

codb1.xxyy.com.cn:3872 就是这些参数的值。在 sqlplus 中以 sysman 用户登录资料库,执行

execute mgmt_admin.cleanup_agent('codb1.xxyy.com.cn:3872');

 

执行过程如下:

/u01/oracle/home@webdg2=>emrep$sqlplus sysman/xxyy2012

 

SQL*Plus: Release 10.2.0.4.0 - Production on Thu May 31 17:15:54 2012

 

Copyright (c) 1982, 2007, Oracle.    All Rights Reserved.

 

 

Connected to:

Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production

With the Partitioning, Real Application Clusters, OLAP, Data Mining

and Real Application Testing options

 

SQL> execute mgmt_admin.cleanup_agent('codb1.xxyy.com.cn:3872');

 

PL/SQL procedure successfully completed.

 

 

接着,我们到监控端服务器上去清理一些文件

进入 grid control 的安装目录,执行下列命令。

rm -r ./sysman/emd/state/*

rm -r ./sysman/emd/collection/*

rm -r ./sysman/emd/upload/*

rm ./sysman/emd/lastupld.xml

rm ./sysman/emd/agntstmp.txt

rm ./sysman/emd/blackouts.xml

rm ./sysman/emd/protocol.ini

 

最后重新配置一下 agent

emctl clearstate agent

emctl secure agent

emctl start agent

 

这一切都执行完成后,检查 emctl upload 是不是正常了。

[oracle@codb1 ~]$ emctl upload

Oracle Enterprise Manager 11g Release 1 Grid Control 11.1.0.1.0

Copyright (c) 1996, 2010 Oracle Corporation.    All rights reserved.

---------------------------------------------------------------

EMD upload completed successfully

执行结果显示已 OK

miki 西游的文档 , 原文链接 : http://mikixiyou.iteye.com/blog/1545847 ,转载请著名作者和出处)

 

<think> 我们正在讨论Scrapy框架中的扩展中间件。根据之前的对话,用户已经了解Scrapy有四种核心中间件类型:爬虫中间件、下载器中间件、扩展中间件(Extensions)和项目管道(Item Pipelines)。现在用户特别询问关于自定义扩展中间件的方法和示例。 扩展中间件(Extensions)是通过Scrapy的信号系统(signals)来工作的,它们可以在Scrapy运行的各个阶段插入自定义逻辑。创建自定义扩展需要以下步骤: 1. **定义扩展类**:创建一个类,并实现必要的方法。 2. **连接到信号**:在类中连接到Scrapy的各种信号(例如`spider_opened`, `spider_closed`等)。 3. **注册扩展**:在Scrapy的配置文件中启用扩展。 下面是一个自定义扩展的示例,该扩展在爬虫启动和关闭时打印日志,并在爬虫运行期间定期打印统计信息(模拟定时监控功能): ```python import logging from scrapy import signals from scrapy.exceptions import NotConfigured logger = logging.getLogger(__name__) class MyExtension: """自定义扩展,用于监控爬虫运行状态""" def __init__(self, stats, interval=60.0): # 初始化统计信息和间隔时间 self.stats = stats self.interval = interval # 定时任务句柄 self.task = None @classmethod def from_crawler(cls, crawler): # 获取配置中的间隔时间,如果没有配置则使用默认值60秒 interval = crawler.settings.getfloat('MYEXT_INTERVAL', 60.0) # 如果扩展未启用,则抛出异常 if not crawler.settings.getbool('MYEXT_ENABLED', True): raise NotConfigured # 创建扩展实例 ext = cls(crawler.stats, interval) # 连接信号 crawler.signals.connect(ext.spider_opened, signal=signals.spider_opened) crawler.signals.connect(ext.spider_closed, signal=signals.spider_closed) return ext def spider_opened(self, spider): """爬虫启动时执行""" logger.info(f"Spider opened: {spider.name}") # 启动定时任务 from twisted.internet import task self.task = task.LoopingCall(self.log_stats, spider) self.task.start(self.interval) def log_stats(self, spider): """定时记录统计信息""" stats = self.stats.get_stats() logger.info(f"Spider {spider.name} stats: {stats}") def spider_closed(self, spider): """爬虫关闭时执行""" logger.info(f"Spider closed: {spider.name}") # 停止定时任务 if self.task and self.task.running: self.task.stop() ``` 在项目的`settings.py`中启用该扩展: ```python EXTENSIONS = { 'myproject.extensions.MyExtension': 500, # 优先级设为500 } MYEXT_ENABLED = True # 默认已启用,此项可省略 MYEXT_INTERVAL = 30.0 # 设置间隔时间为30秒 ``` 这个扩展做了以下事情: - 在爬虫启动时开始一个定时任务,每隔一段时间(通过`MYEXT_INTERVAL`设置)打印一次统计信息。 - 在爬虫关闭时停止定时任务。 注意: - 扩展类必须实现`from_crawler`类方法,用于创建扩展实例并连接信号。 - 使用`crawler.signals.connect`来连接信号处理函数。 - 扩展的执行顺序由`EXTENSIONS`设置中的优先级数值决定(数值越小越先执行)。 通过这种方式,我们可以轻松地扩展Scrapy的功能,例如实现监控、报警、资源清理等。 §§相关问题§§ 1. Scrapy扩展中间件如何接入外部监控系统(如Prometheus)? 2. 如何在Scrapy扩展中处理异常并发送警报? 3. Scrapy的信号系统支持哪些关键生命周期事件? </think> ### Scrapy自定义扩展中间件方法与示例 在Scrapy框架中,自定义扩展中间件(Extensions)是通过订阅**事件系统(signals)**实现的全局功能增强组件。它不属于请求/响应流水线,但能访问Scrapy核心对象(如crawler、stats),常用于监控、通知等场景。 #### 创建方法 1. **定义扩展类** 需实现`from_crawler`类方法和事件处理方法: ```python from scrapy import signals class MyExtension: def __init__(self, crawler): self.crawler = crawler @classmethod def from_crawler(cls, crawler): ext = cls(crawler) # 订阅事件 crawler.signals.connect(ext.spider_opened, signal=signals.spider_opened) crawler.signals.connect(ext.spider_closed, signal=signals.spider_closed) return ext def spider_opened(self, spider): print(f"爬虫启动: {spider.name}") def spider_closed(self, spider, reason): print(f"爬虫关闭: {spider.name}, 原因: {reason}") ``` 2. **注册扩展** 在`settings.py`中激活: ```python EXTENSIONS = { 'myproject.extensions.MyExtension': 500, # 数值表示优先级 } ``` #### 实用示例 **定时性能监控扩展** 每60秒记录爬虫状态: ```python from twisted.internet import task class StatsMonitorExtension: def __init__(self, crawler): self.stats = crawler.stats self.interval = 60 # 秒 self.task = None @classmethod def from_crawler(cls, crawler): ext = cls(crawler) crawler.signals.connect(ext.spider_opened, signals.spider_opened) crawler.signals.connect(ext.spider_closed, signals.spider_closed) return ext def spider_opened(self, spider): self.task = task.LoopingCall(self.log_stats, spider) self.task.start(self.interval) def log_stats(self, spider): stats_data = { "pages": self.stats.get_value('response_received_count', 0), "items": self.stats.get_value('item_scraped_count', 0), "errors": self.stats.get_value('log_count/ERROR', 0) } print(f"[监控] {spider.name}状态: {stats_data}") def spider_closed(self, spider, reason): if self.task and self.task.running: self.task.stop() ``` #### 关键特性 1. **事件订阅机制**: - `engine_started`/`engine_stopped`:引擎启停 - `spider_opened`/`spider_closed`:爬虫启停 - `item_scraped`:数据项抓取成功 - `item_dropped`:数据项被丢弃[^3] 2. **核心对象访问**: ```python def from_crawler(cls, crawler): # 获取配置 interval = crawler.settings.getfloat('STATS_INTERVAL', 60) # 访问统计收集器 stats = crawler.stats # 访问爬虫配置 spider_settings = crawler.spider.settings ``` 3. **执行优先级控制** 通过`EXTENSIONS`字典的值调整顺序(值越小优先级越高)[^1] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值