Назад | Перейти на главную страницу

cat, pipe и acroread - почему иногда он дает сбой?

в простом сценарии оболочки я пытаюсь запустить эту команду:

cat /filelocation/myoutput.PDF | /opt/Adobe/Acrobat7.0/bin/acroread -toPostScript

В большинстве случаев это работает. Однако иногда я получаю сообщение об ошибке:

lp: standard input is empty
lp: request not accepted
Broken pipe
cat: Cannot write to output.

Похоже, это происходит только при больших нагрузках, когда мы рекурсивно обрабатываем большое количество PDF-файлов. (вызывая указанную команду оболочки снова и снова с разными файлами)

Я предполагаю, что, поскольку вы используете STDOUT/STDIN версия -toPostScript что вы подключаетесь к выходу acroread к lp (не показано в вопросе?). У меня такое ощущение, что у вас возникла проблема со спулингом - либо вы полностью заполняете катушку (что вызывает lp to barf) или достижение какого-либо другого ограничения.

Эта ветка обсуждает некоторые способы диагностики невозможности распечатать большой файл (хотя я подозреваю, что печать большого количества маленьких файлов в быстрой последовательности может вызвать те же недуги) -

  • Проверьте, достаточно ли свободного места в / var / spool / lp.
  • Предполагая, что точкой монтирования является / var / spool, проверьте, включена ли для этой файловой системы параметр «largefiles». (Возможно, не применимо к вашей ситуации).

Я почти ничего не знаю о печати, но Я определенно думаю это lp это вызывает проблему, а не cat, acroread или трубы В основном. (Хотя, если вы подозреваете acroread можешь попробовать pdf2ps, утилита, которая поставляется с xpdf).

Вы можете попробовать использовать pdf2ps:

pdf2ps [ options ] input.pdf [output.ps]

Или вы можете установить более новую версию Adobe Acrobat.

Вы могли бы сделать свой сценарий оболочки еще проще и посмотреть, получится ли хотя бы лучше выводить сообщения об ошибках:

 /opt/Adobe/Acrobat7.0/bin/acroread -toPostScript < /filelocation/myoutput.PDF

Это также делает предложенную схему немного лучше:

 strace -f -o /tmp/acroread.$$.strace /opt/Adobe/Acrobat7.0/bin/acroread -toPostScript < /filelocation/myoutput.PDF

Это произойдет, если acroread умер до того, как отправил какой-либо вывод. Не выяснив, почему он умер, у вас нет шансов исправить это. Учитывая его закрытый исходный код, единственное, что вы можете сделать, это попробовать использовать strace, чтобы увидеть, что он делает, когда умирает.

cat /filelocation/myoutput.PDF | strace -f -o /tmp/acroread.$$.strace /opt/Adobe/Acrobat7.0/bin/acroread -toPostScript

Это сделает acroread намного медленнее, но, надеюсь, приведет к сбою при более низких нагрузках, поэтому он должен быстрее увидеть, что вызывает проблему. Обратите внимание, что здесь используется $$ для использования идентификатора процесса скрипта. Если вы вызываете это несколько раз из одного и того же сценария, вам нужно будет найти другой способ использования разных файлов.

Вероятно, это происходит, если трубы не были закрыты должным образом и пытаются снова открыть. Это может произойти, если вы находитесь под большой нагрузкой, как вы говорите.

Попробуйте ввести фактор замедления между вызовами. Может быть, между вызовами вашего скрипта добавьте команду «подождите 1».