2013-05-10 11 views
1

У меня, похоже, тупик. У меня есть скрипты perl, которые обрабатывают и вызывают другие скрипты perl. И процесс где-то висит.Процесс зависает и PIPE заблокирован

Я запускаю программу на: Darwin Kernel Version 12.3.0: Sun Jan 6 22:37:10 PST 2013; корень: XNU-2050.22.13 ~ 1/RELEASE_X86_64 x86_64

"Lsof" имеет 4 записи, относящиеся к одной и той же трубы:

perl5.12 1414 корневые 1 ТРУБА 0x48937dc1254fe937 16384 -> 0x48937dc1254fe727

perl5. 12 1768 1 корень ТРУБА 0x48937dc1254fe937 16384 -> 0x48937dc1254fe727

perl5.12 1759 корень 1 ТРУБА 0x48937dc1254fe937 16384 -> 0x48937dc1254fe727

perl5.12 1760 корень 1 ТРУБА 0x48937dc1254fe937 16384 -> 0x48937d c1254fe727

Я подозреваю, что это причина повесить. Есть ли у нас какие-либо команды, которые могли бы рассказать мне, какой процесс читается/записывается в эту PIPE? Или любая дополнительная информация будет оценена по достоинству. Спасибо заранее!

+0

Хороший вопрос, но вне темы здесь. Попробуйте serverfault или суперпользователь. – pilcrow

ответ

0

Там две вероятные возможности я могу думать:

  1. затор есть из-за буферизации вывода. Попробуйте включить автозапуск на всех выходных трубах. Вероятно, если два процесса связывают двунаправленное использование каналов: они каждый что-то пишут и ждут, чтобы прочитать ответ, но поскольку выход буферизуется, ответ никогда не отправляется в канал.

  2. Процесс ожидает EOF на трубе, но он никогда не приходит. Если труба создается в родительском процессе и затем унаследована дочерним процессом, вам необходимо убедиться, что все процессы закрывают конец записи для того, чтобы читатель прочитал EOF.

+0

Спасибо за быстрый ответ. Я попытался включить autoflush на всех fds (fd-> autoflush;) для скриптов, которые висят (ps -ax). Но это помогает. Я также убедился, что все открытия закрыты. Есть ли способ узнать, какой сценарий, возможно, читает или записывает в PIPE? Спасибо. – AnuRV

+0

Могу ли я закрыть все открытые дескрипторы файлов определенного процесса? У меня нет файловой системы proc (/ proc//fd). – AnuRV

+0

Возможно, вы можете использовать 'dtruss', чтобы узнать, что делает каждый процесс. Но я думаю, вы просто обнаружите, что все они в 'read()', я не знаю, сколько это поможет. – Barmar

 Смежные вопросы

  • Нет связанных вопросов^_^