我有 2 个关于 Solaris SMF 的问题。(我是 SMF 新手。)
我按照https://docs.oracle.com/cd/E37838_01/html/E61677/odbstartstop.html在 SMF 中设置了 Oracle RDBMS 服务
数据库部分完全按预期工作,因此我添加了一个侦听器作为另一个服务实例,因为方法脚本有一个“侦听器”选项作为参数而不是“db”,并且将运行 alsnrctl start ${LISTENER}
而不是使用sqlplus
来访问然后启动或停止数据库实例。
服务的svcadm enable和svcadm disable按预期启动和停止侦听器。问题是框架会感知是否lsnrctl
正在运行,但如果它已停止,则不会重新启动它。见下文:
svc:/site/oracle/db/oracle12lsnr:LISTENER4 (?)
State: maintenance since May 21, 2020 03:25:39 PM BST
Reason: Method failed.
See: http://support.oracle.com/msg/SMF-8000-8Q
See: /var/svc/log/site-oracle-db-oracle12lsnr:LISTENER4.log
Impact: This service is not running.
-原因:方法失败。- 与通过svcadm enable(或disable)调用该方法表明该方法工作正常这一事实不一致。
进一步调查 - 我从 root 杀死了lsnrctl进程并从svcs -Lv得到了这个
[ May 22 14:13:30 Executing stop method ("/lib/svc/method/svc-oracle12-database lsnr stop LISTENER4"). ]
LSNRCTL for Solaris: Version 12.1.0.2.0 - Production on 22-MAY-2020 14:13:30
Copyright (c) 1991, 2016, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=orahost.some.domain)(PORT=1521)))
TNS-12541: TNS:no listener
TNS-12560: TNS:protocol adapter error
TNS-00511: No listener
Solaris Error: 146: Connection refused
[ May 22 14:13:30 Method "stop" exited with status 95. ]
所以第一个问题已经改变,现在是:为什么它会运行 stop 方法?该服务的db版本在数据库服务宕机时运行start方法。
Q1 的答案:服务框架运行 stop 方法,然后运行 start 方法。一旦建立起来,重新审视方法脚本就会发现一个缺陷。如果无法联系到 tnslsnr 进程,则在 stop 方法中退出错误。(逻辑失败。如果 tnslsnr 进程被杀死,您将无法测试与它的连接!)
老实说,我正在努力处理大量信息。我目前正在阅读上面 URL 的 pdf 版本。我在这里快速浏览了 Moellenkamp 的博客http://blog.moellenkamp.org/archives/18-Auditing-a-single-SMF-service-revisted.html但我还没有实现该审计服务 - 假设它会无论如何帮助。如果有人对为什么这不起作用有任何想法,我将不胜感激。
第二个问题是这样的:
在示例中,清单存储在/lib/svc/manifest/site/oracle/db
其中,第一次我将其更改为,/lib/svc/manifest/site/oracle12db
因为 2 个子目录(在 .../site 之后)似乎有点过头了,这导致服务无法以任何方式工作(始终处于维护状态)。我已经调整了清单 xml 文件以匹配更改后的目录结构。我很困惑,在摆弄之后,我只是更改了 xml 文件和目录结构以匹配示例,并且一切正常。为什么会这样?service_name或service_bundle中的图层是否有一些公式?
我还没有读到任何说必须按照示例扩展目录结构的内容。据我所知,我没有打错 xml 文件 - 特别是撤销更改以匹配原始示例只是更改 service_name 和 service_bundle 行以匹配扩展目录结构。