Как мне заставить Linux подождать, пока /dev/usb/lp0 успешно распечатает страницу?

Вопрос или проблема

У меня есть принтер Dell 2130cn USB PCL-XL, и я создаю сервер печати JetDirect/порт 9100 с фильтрами (конвертирует PostScript в PCL-XL, конвертирует PNG и т.д.) для него. Я в основном делаю это, чтобы понять, как работают принтеры и как функционируют CUPS и спулеры печати из-за кулис.

Для контекста, я пытаюсь добавить двунаправленную связь.

Когда я пытаюсь:

echo "Hello World!" > /dev/usb/lp0

Это не ждет завершения задания и вместо этого мгновенно возвращается в оболочку.

Ожидаемый результат:

$ echo "Hello World!" > /dev/usb/lp0
[ ждет, пока бумага выйдет из принтера, затем возвращается в оболочку ]
$ _

Текущий результат:

$ echo "Hello World!" > /dev/usb/lp0
[ мгновенно возвращается в оболочку, не ждет завершения задания ]
$ _

Вы не можете; протокол линейного принтера действительно не предоставляет соответствующую форму обратной связи. На самом деле, многие принтеры вообще не имеют способа сообщить компьютеру, что они закончили с страницей; они могут сказать такие вещи, как “Я готов принять следующий документ для печати”, но это может произойти задолго до завершения текущего задания.

Однако, возможно, ваш принтер это делает через интерфейс, который не является упрощенным линейным принтером (lp означает линейный принтер, вы знаете, эти громкие гигантские устройства 1960-х годов, которые могли печатать текст построчно на бесконечной бумаге, а не страницами?) интерфейс. В этом случае вам нужно будет настроить принтер в CUPS, стандартном менеджере заданий печати на Linux; так что, когда вы отправляете что-то на печать с помощью lpr CUPS, вы можете сделать что-то вроде

timeout=61
while [[ timeout -gt 0 ]]; do
  lpstat -W completed -u \
  | grep -q $ID_GOTTEN_FROM_LPR && break
  timeout=$((timeout - 1))
done
[[ timeout -gt 0 ]] || echo "не завершено за 60 секунд!"
# продолжить

или что-то подобное.

Снова, это не обычно, что принтеры правильно сообщают, что они закончили печатать. Особенно современные принтеры имеют память для множества документов и могут сообщить вам “да, я закончил принимать задание на печать”, и никогда не отчитываются, когда на самом деле они его печатали, или даже завершили его.

Ответ или решение

Для реализации функции ожидания завершения печати на принтере Dell 2130cn в Linux, необходимо понимать, что стандартный интерфейс для работы с принтерами, часто на основе порта USB, не предоставляет возможности для отслеживания статусов выполнения заданий печати. Это связано с ограничениями самих протоколов, используемых для взаимодействия с принтерами, таких как простейший протокол Line Printer Protocol (LPR).

Основные аспекты проблемы

Принтеры, как правило, отправляют ограниченную информацию о состоянии, и многие из них могут сообщать о готовности к приему нового задания, но не подтверждают, когда текущее задание завершено. Однако вы можете использовать системы управления заданиями печати, такие как CUPS (Common Unix Printing System), для более надежного контроля за статусами печати.

Решение с использованием CUPS

  1. Установка и настройка CUPS:

    • Убедитесь, что CUPS установлен в вашей системе. Установите его, если он отсутствует:
      sudo apt install cups
      sudo systemctl start cups
      sudo systemctl enable cups
  2. Добавление принтера в CUPS:

    • Откройте веб-интерфейс CUPS, перейдя по адресу http://localhost:631.
    • Выберите "Administration" и добавьте принтер, следуя указаниям на экране.
  3. Использование команд для печати и отслеживания:

    • Используйте команду lpr для отправки задания на печать:
      lpr файл_для_печати.txt
    • Чтобы отслеживать статус выполнения задания, вы можете использовать следующую оболочку:

      # Получите ID задания
      ID=$(lp -d ваш_принтер файл_для_печати.txt | awk '{print $2}')
      
      # Установите таймаут и цикл ожидания
      timeout=60
      while [[ timeout -gt 0 ]]; do
      lpstat -W completed -u | grep -q $ID && break
      sleep 1
      timeout=$((timeout - 1))
      done
      
      [[ timeout -gt 0 ]] || echo "Задание не завершено за 60 секунд!"

Альтернативные подходы

Если ваш принтер поддерживает другие протоколы, такие как IPP (Internet Printing Protocol), вы также можете исследовать возможность интеграции этих протоколов для более точного контроля статуса печати.

Заключение

Имейте в виду, что многие современные принтеры обладают памятью для временного хранения заданий и могут сообщать системе лишь о готовности принять новое задание, оставляя за пределами своего отчета факт завершения текущей печати. Поэтому с использованием CUPS вы получаете более мощные инструменты для управления печатью и мониторинга статусов, чем просто взаимодействие с /dev/usb/lp0.

Оцените материал
Добавить комментарий

Капча загружается...