如何让bash脚本调用logstash返回提示符

如何让bash脚本调用logstash返回提示符

由于各种原因,我没有将logstash(7.10.1)作为服务运行,而是在bash脚本中按需调用它:

/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/my_ls.conf &
echo ""
echo "#########################################################"
read -p "Press enter to continue "

它工作得很好,但是当成功创建elasticsearch索引时,它总是暂停:

[INFO ]  [[main]-pipeline-manager] javapipeline - Pipeline Java execution initialization time {"seconds"=>1.3}
[INFO ]  [[main]-pipeline-manager] javapipeline - Pipeline started {"pipeline.id"=>"main"}
[INFO ]  [[main]<file] observingtail - START, creating Discoverer, Watch with file and sincedb collections
[INFO ]  [Agent thread] agent - Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
[INFO ]  [Api Webserver] agent - Successfully started Logstash API endpoint {:port=>9600}

为了使其返回到 CLI 提示符,我需要从另一个 SSH 终端运行以下命令:

pkill -f logstash 

这当然很不方便,我正在寻找一种方法让 bash 脚本提示“按任意键退出”。

我的问题是,logstash 调用(附加)之后的语句(包括&提示)read -p "Press enter to continue"会在 Logstash 实际开始执行其工作之前显示,并且 bash 脚本永远不会退出到 CLI 提示符。

当logstash完成索引创建时,使bash脚本提示“按任意键退出”的正确方法是什么?

答案1

解决了!

具体方法如下:

首先,重要的是要承认,正如@roaima 所指出的那样,它的设计目的确实logstash不是为了构建索引然后退出。掌握这些知识有助于专注于@Alex 建议的解决方法。此外,这个已知的限制导致了基于logstash插件的解决方法,如下所述:

  1. 执行插入
  2. 出口插入

然而,插件需要安装在每个logstash实例上,并在每个.conf文件中都有自己的声明。

所以,我发现了这个UL 答案,它给我提供了解决方案:

    LS_OUTPUT=$(mktemp "${TMPDIR:-/tmp/}$(basename 0).XXX")
    /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/my_ls.conf &> $LS_OUTPUT &
    LS_PID=$!

    echo "Logstash pid: ${LS_PID}"
    echo "Logstash output: $LS_OUTPUT"
    echo "Wait:"

    until grep -q -i 'agent - Successfully started Logstash API endpoint' $LS_OUTPUT
    do
      if ! ps $server_pid > /dev/null
      then
        echo "Logstash died. Exiting." >&2
        exit 1
      fi
      echo -n "."
      sleep 1
    done
    echo
    echo "Logstash is running!"

相关内容