首页 > 解决方案 > 注意在 bash while 循环中出现超时的日志行

问题描述

我确实有一个 bash 脚本来运行 Jira 迁移。Jira7 Docker 容器应该运行直到重新索引完成并超时两小时,然后启动 Jira8 容器。

#!/bin/bash -ex

SECONDS=0

docker-compose -f /root/docker-compose-jira7.yml up -d

docker logs jira7 >& /tmp/jira7.log

while ! grep "Re-indexing is 100% complete" /tmp/jira7.log > /dev/null;  [[ $SECONDS -lt 7200 ]]
do
    sleep 60
    docker logs jira7 >& /tmp/jira7.log
done

docker-compose -f /root/docker-compose-jira7.yml down

docker-compose -f /root/docker-compose-jira8.yml up -d

printf \
  'It took %dh:%dm:%ds to run the migration process\n' \
  $(($SECONDS/3600)) $(($SECONDS%3600/60)) $(($SECONDS%60))

我在日志中查找的字符串行如下所示:

2020-07-24 16:07:56,347 SharedEntityIndexer:thread-6 INFO localadmin 951x74x1 1y619f7 XXX.XXX.XXX.XXX,172.19.0.2 /secure/admin/IndexReIndex.jspa [c.a.j.w.a.admin.index.IndexAdminImpl] Re-indexing is 100% complete. Current index: PortalPage

仅寻找日志行出现的 while 循环工作正常。然后我添加了 timeout 选项[[ $SECONDS -lt 7200 ]],但现在日志行搜索不再起作用。

在 while 循环中具有这两个条件的正确方法是什么?

标签: bash

解决方案


使用&&以便两个命令都必须成功才能继续循环。使用;时,将! grep ...忽略的退出状态,循环考虑的退出状态。[[ ...]]

while ! grep "Re-indexing is 100% complete" /tmp/jira7.log > /dev/null &&
      [[ $SECONDS -lt 7200 ]]
do
    ...

推荐阅读