いくつかの理由で、私は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プラグインに基づく解決策が生まれました。
ただし、プラグインはすべての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!"