svn logでBroken pipe発生

現象

svn log を head でパイプすると Broken pipe エラーが発生する

$ svn log | head -n0
svn: Write error: Broken pipe

原因

head コマンドは、出力に必要な入力を受け取ると標準入力をクローズして終了し、一方で svn log はクローズされた標準出力(パイプ)にライトしようとして SIGPIPE シグナルを受け取る。
シグナルハンドラーをいじっていなければ、そのまま強制終了するのだけど、svn log はこのシグナルを SIG_IGN しているようで、ライトがエラー EPIPE で異常終了する。

類似の問題

Pythonruby でも類似の問題が発生する。

Python のマニュアルの signal の冒頭には SIGPIPE SIG_IGN していることが書かれている、

Python installs a small number of signal handlers by default: SIGPIPE is ignored (so write errors on pipes and sockets can be reported as ordinary Python exceptions) and SIGINT is translated into a KeyboardInterrupt exception. All of these can be overridden.
http://docs.python.org/2/library/signal.html

実際に試すと

$ python -c "print ('\n'* 10000)" | head -n0
Traceback (most recent call last):
  File "<string>", line 1, in <module>
IOError: [Errno 32] Broken pipe

対応

subversion ではこの問題が 2007 年から報告されており、2011 年に修正され 1.7 からエラーメッセージが改善されている模様。(手元に svn 1.7 以上がないので未確認)

#3014 :”svn log | head” should not print “Write error: Broken pipe”
http://subversion.tigris.org/issues/show_bug.cgi?id=3014

Python/ruby などでは、プログラム内で SIG_IGN SIG_DFL に変更するとその場しのぎ的に解消はできる。

signal(SIGPIPE,SIG_DFL)

だけど、言語レベルで挙動をかえてほしいなぁ、、、

Advertisements
Tagged with: , , ,
Posted in linux
One comment on “svn logでBroken pipe発生
  1. […] しらべたらそういうものらしいので放置。(もう大丈夫かもしれんけど大事なとこでないので受け入れる。) […]

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Archives
%d bloggers like this: