我有一个在 OpenSolaris 上运行的媒体服务器,它使用 Coherence 向网络提供媒体。有时我在启动时遇到问题,因为 Coherence 服务无法启动,因为锁文件仍然存在(未正确清理)。
我想知道在 Coherence 服务尝试启动之前在启动时删除此文件的最佳/最简洁/最官方的方法是什么。
我考虑编写一个快速脚本并将其放在 /etc/rc3.d/ 中,但我读到 OpenSolaris 不一定从该位置运行脚本。
答案1
Solaris 使用 SMF 来管理服务,但仍支持 rc 结构。您的系统上以哪种方式启动 Coherence?我认为您需要对锁定删除脚本使用相同的方法。
有关 Solaris 服务管理工具 (SMF) 的文档,请参见这。
从该页面开始:
请注意,svcadm 只能用于 SMF 服务 - 旧版 rc 脚本控制的服务工作方式与过去的版本相同。
和:
由传统 rc 脚本启动的服务(称为旧式服务)通常会继续像往常一样工作。它们将显示在 svcs(1) 的输出中,并带有基于其 rc 脚本路径名的 FMRI,但它们无法由 svcadm(1M) 控制。应通过直接运行 rc 脚本来停止和启动它们。
正如“值得注意的变化”部分所述,rc 脚本在启动时运行的时间点可能与早期版本的 Solaris 中不同。特别是,依赖于在某些 Solaris 提供的 rc 脚本之前运行的脚本可能会遇到问题。不过,绝大多数脚本应该可以继续正常工作,不会出现任何问题。
答案2
只是为了给未来的人们提供信息。
我通过修改 coherence.sh 脚本(svcadm 使用该脚本来启动/停止服务器)解决了我的问题,添加了代码来检测服务器是否正在运行,如果没有运行则删除那里的日志文件。
插入的代码:
check() {
if [ -f ${LOCKFILE} ]; then
pgrep -f /usr/bin/$PROGNAME &> /dev/null
RETVAL=$?
[ ${RETVAL} -ne 0 ] && rm -rf ${LOCKFILE}
echo ${RETVAL}
fi
return 0
}
然后我从 start() 函数的开头并在 stop() 函数返回之前调用了此函数。
这将检查可执行文件是否正在运行,如果没有运行,则删除日志文件。似乎运行正常,我没有遇到任何问题。