私のbashバッファリングの問題は、ここで見つけることができる問題と似ています。パイプラインでバッファリングをオフにする
上記の質問のsocatソリューションは、initrd dracutフックスクリプトからこのコマンドにアクセスできるため、非常に興味深いものです。残念ながら、これを私の特定の問題に適用する方法がわかりません。 Journalctl json出力の「リアルタイム」解析(バッファリング防止)。 Journalctlが出力するように各行(各\ n)を処理します。
logmessage() 関数は、バッファがいっぱいになった場合にのみ呼び出され、新しいジャーナル行が印刷されると呼び出されません。問題がjqより前にあるのか、それとも「<<(」リダイレクトにあるのかわかりません)。
(logmessage()は、ログファイルとPlymouthコンソールにメッセージを書き込む簡単な関数です。)
以下のコードでは、バッファがいっぱいになったときにのみ処理されるため、私には役に立ちません。
{
SEVERITY=( emerg alert crit err warning notice info debug )
FACILITY=( kern user mail daemon auth syslog lpr news uucp cron authpriv ftp ntp security console cron local0 local1 local2 local3 local4 local5 local6 local7 )
while read LOG_FACILITY LOG_SEVERITY LOG_TAG LOG_MESSAGE
do
logmessage ${FACILITY[$LOG_FACILITY]}.${SEVERITY[$LOG_SEVERITY]} "$LOG_TAG" "$LOG_MESSAGE"
done < <( journalctl --follow -o json --no-pager --no-tail | jq -r '"\(.SYSLOG_FACILITY // 3) \(.PRIORITY // 6 ) \(.SYSLOG_IDENTIFIER // "journald") \(.MESSAGE | sub("\\n";" ";"g") // "no message")"' )
}&
このコードは特別なinitramfsの一部です。 socat コマンドを使用できます。リアルタイムでログを解析し、施設、優先順位、タグ、メッセージを他の宛先(ログファイル、Plymouthコンソールプラグインなど)に送信する必要があります。
どんなアドバイスも本当にありがとうございます。 (このコードはsystemimagerソフトウェア(GPL)の一部になります。) https://github.com/finley/SystemImager/wiki
どんなアドバイスも本当にありがとうございます。
答え1
<(...)
次の代わりにパイプを使用すると、何が得られるのかわかりません。
journalctl ... |
jq -r ... |
while read LOG_FACILITY LOG_SEVERITY LOG_TAG LOG_MESSAGE
do logmessage ...
done
もちろん、両方のバージョンに同じバッファリングの問題があります。
ただし、どちらの場合も、次を使用してコマンドをsocat
実行したい場合jq
jq -r ...
socat -u EXEC:'jq -r ...',pty,ctty STDIO
しかし、大きな問題があります。パラメータを引用する必要があります。jq
これにより、パラメータがsocat
少し混乱し、文字列を正しく渡すことが困難になります。この問題を解決する1つの方法は、コマンドをシェル変数に保存して後で使用することです。
export cmd="$(cat <<\!
jq -r '"\(.SYSLOG_FACILITY // 3) \(.PRIORITY // 6 ) \(.SYSLOG_IDENTIFIER // "journald") \(.MESSAGE | sub("\\n";" ";"g") // "no message")"'
!
)"
socat -u SYSTEM:'eval $cmd',pty,ctty STDIO
しかし、最終的には、jq
1つのオプションを選択すると--unbuffered
望ましい効果を得ることができるので、これらのいずれも必要ありません。