适用于 Oracle DB 的 Solaris SMF 可以,但不适用于 Listener。 SMF 方法如何在 svcadm 下工作但在失败时不重新启动服务?

Solaris SMF for Oracle DB is ok but not for the Listener. How can an SMF method work under svcadm but not to restart the service when it has failed?

我有 2 个关于 Solaris SMF 的问题。 (我是SMF新手。)

我按照 https://docs.oracle.com/cd/E37838_01/html/E61677/odbstartstop.html

在 SMF 中设置了 Oracle RDBMS 服务

数据库部分完全按预期工作,所以我添加了一个 listener 作为另一个服务实例,因为方法脚本有一个选项 'listener' 作为参数'db' 并将 运行 变成 lsnrctl start ${LISTENER} 而不是使用 sqlplus 来访问然后启动或停止数据库实例。

svcadm enablesvcadm disable服务的启动和停止listener为预期的。问题是框​​架检测到 lsnrctl 是否为 运行ning,但如果它已停止,则不会重新启动它。见下文:

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. ]

所以第一个问题已经改变,现在是:为什么 运行 停止方法?此服务的 db 版本 运行 数据库服务启动时的 start 方法下来。

问题 1 的答案:服务框架 运行 停止方法后跟启动方法。一旦确定了这一点,重新审视方法脚本就会发现一个缺陷。如果无法联系 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 个子目录(在 .../站点)似乎有点过头了,这导致该服务无法以任何方式工作(始终处于维护状态)。我 调整清单 xml 文件以匹配更改后的目录结构。我很困惑,在摆弄之后,我只是更改了 xml 文件和目录结构以匹配示例,并且一切正常。为什么会这样? service_nameservice_bundle?

中的图层是否有一些公式

我还没有读到任何说明必须按照示例扩展目录结构的内容。据我所知,我没有打错 xml 文件 - 特别是撤销更改以匹配原始示例只是更改 service_name 和 service_bundle 行以匹配扩展目录结构。

要诊断服务失败的原因,请始终从服务日志开始,其路径在 svcs 输出中。或者直接用"svcs -Lv "显示即可。

另一个'easy when you know how'。 失败时,框架运行 stop 方法,然后运行 ​​start 方法。

我现在可以浏览 pdf 并确认这一点以及 restartrefresh 等内容。 我将投票支持 user13596356 的响应,因为检查日志的快速周转和 7 年前 user40330 从 SMF 问题中输入的一些信息让我看到了有缺陷的服务方法脚本。