On Wed, Sep 07, 2005 at 01:11:05PM +0400, Alexey Tourbin wrote: > On Mon, Sep 05, 2005 at 03:19:19AM +0400, Dmitry V. Levin wrote: > > > Мне от робота на stderr происходит следующий стук: > > > /raid/at/qa/qa-robot/qa-robot: line 113: 14965 Broken pipe perl -MList::Util=shuffle -e 'print shuffle(<>)' ${1+"$@"} > > > > > > shuffle() { perl -MList::Util=shuffle -e 'print shuffle(<>)' ${1+"$@"}; } > > > shuffle {bad,pending}.bugs |head -20 |sort -u |shuffle |head -10 |xfmt1 > > > > > > Кто-нибудь может объяснить, почему он происходит? > > > > Это классика: какая-то программа (perl -M...) генерит много строк, head > > использует только первые несколько, в результате канал закрывается до > > того, как perl успевает всё туда записать, и perl получает SIGPIPE. > > А кто говорит "Broken pipe"? То есть это shell говорит, когда делает > wait(2) и видит WIFSIGNALED и WTERMSIG == SIGPIPE? Кажется, я начинаю > понимать, как это всё работает. :) > > И как же от этой напасти защититься? То есть процесс получает SIGPIPE > при первой же попытке записи в дохлый пайп? Если бы wirte(2) хотя бы > один раз -1 вернул, перл может быть и сам бы отвалил. $SIG{'PIPE'} = 'IGNORE' ? Или вообще perl -MList::Util=shuffle -e "print((shuffle(<>))[0..$n])" и убрать head.