我是 Linux/编码/脚本的新手。
我目前有一个脚本可以在 RHEL 5.5 上启动 OBIEE 应用程序的服务。这是我的脚本中的一个示例:
case "$1" in
start)
echo -e "Starting Node Manager..."
$ORACLE_FMW/wlserver_10.3/server/bin/startNodeManager.sh > startNodemanager.log 2>&1 &
sleep 30
echo -e "Starting Weblogic Server...."
$ORACLE_FMW/user_projects/domains/bifoundation_domain/bin/startWebLogic.sh > startWeblogic.log 2>&1 &
如您所见,我正在尝试使用 30 秒的时间间隔依次启动 2 个服务,而不管第一个服务(节点管理器)是启动还是失败。
我想根据第一个服务 (NodeManager) 的输出(startNodemanager.log)执行/启动第二个服务(weblogic),而不是在脚本中使用静态时间间隔。
当 NodeManager 成功启动时,它会以特定字符串结束其日志文件。例如:
“信息:安全套接字监听器在端口 9556 上启动”
那么是否可以在我的脚本中编写一些命令(代替时间范围)从输出日志中读取该字符串并仅在接收到所需字符串时才执行第二个服务,直到那时才停止执行第二个服务。
谢谢。
=======================
编辑:
我已经按照下面 yingted 的建议更新了脚本。 它还没有解决我的问题。 read 正在推迟触发第二个服务,但即使在日志中记录了所需的消息后也无法触发它。使用您的命令,我更新后的脚本如下所示:
case "$1" in
start)
echo -e "Starting Node Manager..."
$ORACLE_FMW/wlserver_10.3/server/bin/startNodeManager.sh > startNodemanager.log 2>&1 &
read -r < <(tail -f startNodemanager.log | grep --line-buffered -Fx -- 'INFO: Secure socket listener started on port 9556')
echo -e "Starting Weblogic Server...."
$ORACLE_FMW/user_projects/domains/bifoundation_domain/bin/startWebLogic.sh > startWeblogic.log 2>&1 &
问题可能与日志中的消息有关。 实际上,消息“INFO: Secure socket listener started on port 9556”在日志中以时间戳开头。
无论如何我可以添加时间戳作为通配符条目吗?
最佳答案
您的第二个流程应该在第一个流程之后。
read -r < <(tail -f startNodemanager.log | grep --line-buffered 'INFO: Secure socket listener started on port 9556$')
读取命令一直等到 startNodemanager.log
包含以 INFO: Secure socket listener started on port 9556
结尾的行。
read
还接受一个 -t timeout
标志,如果超过超时,它会退出并设置 $?
大于 128。如果它反而成功了,read
返回 0。
关于Linux:从文件中读取字符串并在其他脚本中执行命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25885460/