On Sun, Jul 18, 2010 at 12:11:50AM +0200, Jilles Tjoelker wrote: > On Sat, Jul 17, 2010 at 06:24:55PM +0300, Alex Kozlov wrote: > > After updating my buildbox from 26 April 8-STABLE > > to 8.1-RC2 I constantly getting SIGEPIPE > > > portsnap: > > Fetching 4 metadata patches... done. > > Applying metadata patches... done. > > Fetching 0 metadata files... done. > > Fetching 27 patches.....10....20... done. > > Applying patches... done. > > Fetching 3 new ports or files... done. > > sort: write failed: standard output: Broken pipe > > sort: write error > > Removing old files and directories... done. > > > sudo make -C /usr/ports/converters/ascii2binary: > > ===> Patching for ascii2binary-2.13_2 > > ===> Applying FreeBSD patches for ascii2binary-2.13_2 > > ===> ascii2binary-2.13_2 depends on shared library: intlgrep: writing > > output: Broken pipe > > grep: writing output: Broken pipe > [snip repetition] > > - found > > ===> Configuring for ascii2binary-2.13_2 > > > Does anyone know something about this issue? > > This looks more like the absence of SIGPIPE than an inappropriate > SIGPIPE. I can reproduce both of those error messages by running the > commands with SIGPIPE ignored. grep(1) seems to behave strangely on > write errors, not aborting, for example > yes | { trap '' PIPE; grep -v foo; echo $? >&2; } | : > prints an endless stream of error messages. > > Note that sh(1) silently ignores attempts to change the disposition of > signals that were ignored on entry to the shell, so a > trap - PIPE > is unlikely to help you. > > Similarly, SIGPIPE may be blocked (masked). Few programs expect this. > > The -i and -j options in procstat should be helpful in finding what > exactly is wrong with SIGPIPE. (These options are relatively new, but > should be in 8.1.)
Might be, but now I have a feel that something more strange happens there. One of my workstations does not exhibit the behaviour, while another one did. I composed the following grep wrapper to catch the situation you guessed: #!/bin/sh disp=$(procstat -i $$ | awk '/PIPE/{print $4}') if expr -- $disp : I >/dev/null ; then echo "grep: SIGPIPE ignored" >/dev/tty kill -STOP $$ fi exec /usr/bin/grep "$@" Amazingly enough, the messages stopped spitting. Even more, I cannot reproduce them on the machine without the wrapper. Side note: despite ports/Mk/bsd.commands.mk defining GREP and EGREP, there are still several instances of the direct grep invocation among Mk/* files. Do port people consider this worth fixing ?
pgpQuV0FjJApq.pgp
Description: PGP signature