まさか!?のパイプ詰まり [Vine Linux]
ここのコメント欄で munepi さんが提案してくれたビルドログのサイズの丸め方を、直に self-build-rpm.sh 叩きながら試していたところ、引数で渡すログサイズを段々小さくしていくと、ある所から rpm パッケージのビルドに失敗するのに気付いた。
なんじゃこりゃ?と思いつつ sh -x のデバッグ出力を眺めながら試行錯誤した結果、こんな事が起きていることが分かった。
ビルドの進捗を zenity で表示する為にスクリプト中でパイプを使って標準出力を渡している所がある。
rpmbuild(1) | tee(2) | percentage(func)(3) | zenity(4)
rpmbuild の出力を tee に渡してログファイルに書き出しつつ、自前の関数 percentage でログサイズとの比率を計算して一定間隔で出力し zenity でプログレスバーを表示する、という流れ。
ここでスクリプトに意図的に小さいログサイズを渡してやると、
- ビルド開始
- zenity がプログレスバーを表示
- 比率が100を越える
- zenity が自動で閉じる
- でもビルド継続
- percentage が比率を計算して出力
- でもパイプの後ろで受け取るプロセスが無い
- エラーで終了~
となりサブシェル全体が落ちるので、rpm のビルドも強制終了されていた。
という事で対策として比率が100を越えたら出力しないように percentage 関数を修正して無事 OK に。
# シェルのパイプが「詰まる」なんて知らなかったので
# 良い勉強になりました。眠かったけど……。
なんじゃこりゃ?と思いつつ sh -x のデバッグ出力を眺めながら試行錯誤した結果、こんな事が起きていることが分かった。
ビルドの進捗を zenity で表示する為にスクリプト中でパイプを使って標準出力を渡している所がある。
rpmbuild(1) | tee(2) | percentage(func)(3) | zenity(4)
rpmbuild の出力を tee に渡してログファイルに書き出しつつ、自前の関数 percentage でログサイズとの比率を計算して一定間隔で出力し zenity でプログレスバーを表示する、という流れ。
ここでスクリプトに意図的に小さいログサイズを渡してやると、
- ビルド開始
- zenity がプログレスバーを表示
- 比率が100を越える
- zenity が自動で閉じる
- でもビルド継続
- percentage が比率を計算して出力
- でもパイプの後ろで受け取るプロセスが無い
- エラーで終了~
となりサブシェル全体が落ちるので、rpm のビルドも強制終了されていた。
という事で対策として比率が100を越えたら出力しないように percentage 関数を修正して無事 OK に。
# シェルのパイプが「詰まる」なんて知らなかったので
# 良い勉強になりました。眠かったけど……。
コメント 0