発生したこと
aws-cliでフィルタリングかけて、AMI-ID情報持ってきて変数にいれようとしたら
■実行コマンド
AMI_ID=`aws ec2 describe-instances --region ${REGION}\
--filter "availability-zone == ${AZ}" \
"Name=tag-key,Values=Resource" "Name=tag-value,Values=${TAG_RESOURCE}"\
--query "Reservations[].Instances[].ImageId" \
--output text | head -n 1`
■結果
******** #出力結果
[Errno 32] Broken pipe
とでてしまい、[Errno 32] Broken pipe
がでてしまっていた。
最初以下を読んでも何のことか分からず、結構はまってしまった
Broken pipe
データを読み取るプロセスのないパイプへの書込みです。通常この状態が発生すると信号が生成され、その信号が無視されると、エラーが返されます。
引用元:http://software.fujitsu.com/jp/manual/manualfiles/M090098/J2X14260/06Z201/pclmsab/pclms130.html
正しい値は取れているが、ログを出力していたので見た目的によろしくない。
原因
コマンドにより標準出力にすごい長い結果がでてしまい、それをパイプラインを使ってhead
で受け取っていたのがよくなかった。
5/21追記
broken pipe
は、「読み込むプロセスがいない(headが終了した)にも関わらず書き込もうとした」ことが
原因とコメントでいただいた。
今回の場合だと出力が多く、書き込みが分割されると後にまわされた出力を読み込むプロセスがなくなり
broken pipe
がでている可能性が考えられる。
angel_p_57さん、コメントにてご教示いただきありがとうございます。
解決
実行コマンドの最後の一文を以下のように変更し、出力されないようにした。
--output text 2>/dev/null | head -n 1`
どれくらい長いものだとだめなのかは結局分からずだけど・・・。
PIPE_BUF(デフォルト4096byte)の数値によるとコメントでいただきました