36

У меня есть принтер в CUPS, который из-за проблем с драйверами (HP 1010) время от времени переходит в паузу.

Я хотел бы написать сценарий оболочки, который будет выполняться раз в час, чтобы возобновить работу принтера в CUPS. Но я не знаю после нескольких минут поиска в Google, как возобновить работу принтера из командной строки оболочки.

12 ответов12

58

Есть команда cusenable.

cupsenable printer

запускает отключенный принтер (чтобы узнать имя принтера, вы можете перечислить ваши принтеры со lpstat -p или lpc status).

Возможно, вам придется выполнить команду от имени пользователя root или с помощью sudo. Поэтому, если вам нужно включить принтер в сценарии оболочки, вам придется добавить оболочку в корневой каталог root или отредактировать файл sudoers.

23

Ваша проблема может быть решена по-разному, в зависимости от используемой версии CUPS.

  1. Более свежие версии CUPS (версия 1.2 и выше) поставляются со встроенной функциональностью, которая может помочь здесь. Это называется "ErrorPolicy". Его настройка по умолчанию выбрана в cupsd.conf и определяет, как cupsd должен обрабатывать очереди печати, которые ведут себя не так, как ожидалось. У вас есть 3 варианта пометить каждую очередь в отдельности:

    ErrorPolicy abort-job  
    ErrorPolicy retry-job  
    ErrorPolicy retry-this-job  
    ErrorPolicy stop-printer  
    

    Объяснение:

    • abort-job
      - отменить эту работу и перейти к следующей работе в той же очереди

    • retry-job
      - Повторите эту работу после ожидания в течение N секунд (где N определяется директивой cupsd.conf «S„JobRetryInterval“).

    • retry-this-job
      - Повторите текущую работу немедленно и на неопределенный срок.

    • stop-printer
      - Остановите текущую очередь печати и сохраните задание для дальнейшей печати. Это по-прежнему по умолчанию, если вы не определите иначе в соответствии с вышеупомянутыми альтернативами. Это также было по умолчанию + только возможное поведение для всех очередей в предыдущих версиях CUPS (ту, от которой вы действительно хотите избавиться согласно вашему вопросу).

    Кроме того, вы можете установить отдельные ErrorPolicies для каждой отдельной очереди печати. Этот параметр будет указан в файле printers.conf. (Установите его из командной строки с помощью lpadmin -p printername -o printer-error-policy=retry-this-job).

  2. Для более старых версий CUPS я бы рекомендовал взглянуть на beh , CUPS BackEnd Handler. beh представляет собой оболочку , которая может быть применена к любому CUPS бэкэнду.

    Предполагая, что ваша очередь печати в настоящий момент определила серверную часть socket://192.168.1.111:9100 , и она ведет себя не так, как вам нравится (время от времени она отключается cupsd из-за проблем с сетевым подключением). С помощью beh вы переопределите свой бэкэнд следующим образом:

    beh:/0/20/120/socket://192.168.1.111:9100
    

    Это будет повторять задание 20 раз с двухминутным интервалом и отключать очередь только в том случае, если она по-прежнему не выполняется. Или вы могли бы сделать это:

    beh:/1/3/5/socket://192.168.1.111:9100
    

    Это повторяет задание 3 раза с 5-секундными задержками между попытками. Если задание все еще не выполнено, оно отбрасывается, но очередь не отключается. Вы хотите, чтобы cupsd пытался бесконечно подключаться к устройству? Хорошо, попробуйте это:

    beh:/1/0/30/socket://192.168.1.111:9100
    

    Попробуйте бесконечно, пока принтер не вернется. Интервалы между попытками подключения составляют 30 секунд. Задание не теряется при выключении принтера. Вы можете намеренно задержать печать, просто выключив принтер. Хорошая конфигурация для настольных принтеров и / или домашних пользователей.


В целом, нет необходимости возиться с bash-скриптами, cron-заданиями, lpadmin , cupsenable или sudo для повторного активирования очередей CUPS, которые работают беспорядочно.

8

Опция -E принтера, используемая с lpadmin должна сделать это. Вероятно, вы можете просто создать задание cron с помощью команды lpadmin .

lpadmin [-U username ] [ -h server[:port] ] -p printer option(s)

Почасовая запись в cron :

0 * * * * /usr/sbin/lpadmin -p your_printer -E

Вы можете добавить это, запустив:

sudo crontab -e

Убедитесь, что вы добавили -E после имени принтера, потому что это здесь опция принтера, а не lpadmin. Обратите внимание на следующий отрывок со страницы man lpadmin который был указан в комментарии ниже:

При указании перед параметрами -d, -p или -x параметр -E включает шифрование при подключении к серверу.

6

Мой принтер HP CP1215 также имел ошибку: Принтер приостановлен - «/usr/lib/cups/backend/hp fail»

После перезапуска cups и avahi-daemon и идентификации принтера с помощью lpstat -p и включения с помощью cupsenable , я смог снова печатать. Перезапуск только cups и включение не помогли.

Я также изменил политику по умолчанию на retry-job и в итоге избежал ошибок в будущем с помощью cronjob:

* * * * * lpstat -p |grep "poissa käytöstä" && service avahi-daemon restart; service cups restart; cupsenable HP_Tuloostin

где poissa käytöstä - финский текст локализации для технического обслуживания "вышел из строя", а HP_Tuloostin - имя моего принтера.

По моему опыту, политики по умолчанию и текущие политики принтеров должны быть настроены для повторной работы. Политика по умолчанию - это просто политика, которую вы получаете при установке нового принтера.

2
ls /etc/cups/ppd/ |cut -d "." -f1 |grep -v VMware |xargs -i cupsenable {}

В этом списке перечислены все файлы ppd, представляющие установленный принтер, обрезается расширение ppd, игнорируется ppd VMware, включенный на многих серверах VMware (если вам это не нужно, просто удалите |grep -v VMware) и передайте другие имена. к xargs который останавливает все принтеры.

Работа cron должна сделать это хорошо.

1

Если проблема связана с тем, что для возобновления работы принтера для входа в графический интерфейс требуется вход в систему, тогда можно разрешить возобновление работы принтера через графический интерфейс без входа в систему. Для этого закройте чашки и отредактируйте эту строку sudo vi /etc/cups/cupsd.conf:

<Limit Pause-Printer Resume-Printer Enable-Printer Disable-Printer Pause-Printer-After-Current-Job Hold-New-Jobs Release-Held-New-Jobs Deactivate-Printer Activate-Printer Restart-Printer Shutdown-Printer Startup-Printer Promote-Job Schedule-Job-After Cancel-  Jobs CUPS-Accept-Jobs CUPS-Reject-Jobs>

И удалите директиву Resume-Printer , затем перезапустите чашки. Если директива присутствует в нескольких разделах <Limit> вы можете удалить ее из соответствующего раздела <Policy> или удалить из всех. Теперь вы сможете возобновить работу принтера без входа в систему через графический интерфейс. Я видел это на macworld, но это относится к любой установке чашек.

0

Пришлось иметь дело с такой же ерундой CUPS здесь ... Решением для меня был сценарий systemd, который запускается каждые n минут.

/usr/local/cups/enable_cups_printers.sh

#!/bin/sh
for printer in $(lpstat -v | perl -pe 's/device for ([A-Za-z0-9_]+):.*/\1/g')
do
    echo "Forcely enabling printer: $printer"
    # Enable:-E PrinterId:-p
    /usr/bin/lpadmin -E -p "$printer"
done

cups.enable.printers.service

[Unit]
Description = Forcely enable printer occassionally. Why CUPS disables printers in the first place has yet to be determined.

[Service]
Type = simple
ExecStart = /usr/local/cups/enable_cups_printers.sh

[Install]
WantedBy = multi-user.wants

cups.enable.printers.timer

[Unit]
Description=Run enable printers frequently to ensure connection difficulties are remedied.

[Timer]
OnBootSec=15min
OnUnitActiveSec=300

[Install]
WantedBy = timers.target
0

Я обновил cupsd.conf с помощью строки:

ErrorPolicy abort-job

Затем я перезапустил cupsd, используя:/etc/init.d/cups restart

Но когда я смотрю на файл printers.conf, ErrorPolicy не обновляется. Согласно документации на чашки, в разделе «Принтер» должна появиться строка «ErrorPolicy abort-job».

Я также пытался с помощью lpadmin обновить ErrorPolicy. Ничто не изменяет ErrorPolicy или не делает его в файле printers.conf.

Что мне не хватает? Как мне убедиться, что cupsd на самом деле прерывает работу по ошибке?

0

У меня не получилось несколько решений (например, sudo cupsenable и lpadmin -E).

Если вы используете Debian 8.6, Cinnamon 2.2.16 (Linux) делает это из меню запуска вашего графического интерфейса:

Click Administration | Print Settings,
Then select your stalled CUPS printer,
Click Unlock (and give it your admin password),
Click Server | Settings,
In this click the blue "Problems?" link. 

Для Ubuntu 16.04:

Click System Settings | Printers,
Then Server | Settings,
Click the blue "Problems?" link. 

Это открывает принтер устранения неполадок. Он скажет вам, что делать дальше.

Возможно, вам просто нужно проверить свойство Enabled для вашего принтера CUPS в настройках печати. (Вам нужно будет сначала разблокировать).

Наконец, чтобы этого не произошло, измените "политику" для принтеров на "повторную работу" в настройках принтера, упомянутых выше (в свойствах | политиках).

Исправил это для меня!

Что вызывает эту проблему: если мой принтер Wi-Fi выключен, когда я печатаю на принтере CUPS, и моя политика - "остановить принтер", то я получаю сообщение, что не могу печатать, и принтер отключен ("Включено" не проверено), Только если для политики задано значение "Повторить задание", параметр "Включить" не будет отключен. Через несколько минут после включения принтера ваши задания начнут печататься.

(Мой другой пост об этом.)

0

lpadmin -p p-go-avtom2 -v p-go-avtom2 -E

Источник

0

Ответ от Janne выше, например:

* * * * * lpstat -p |grep "poissa käytöstä" && service avahi-daemon restart; service cups restart; cupsenable HP_Tuloostin

... приведет к перезапуску CUPS каждую минуту, независимо от состояния принтера. Это связано с тем, что условие перезапуска cups не связано с &&.

Вот короткий BASH-скрипт, который я использовал, чтобы сделать перезапуск CUPS условным при обнаружении состояния сбоя.

#!/bin/bash

DATE=$(date)
DS40=$(/usr/bin/lpstat -p |grep "DS40" |grep "disabled")

if [ ! -z "${DS40}" ]; then
    echo "${DATE} - Restarted avahi and cups" >> /var/log/cups/restart-cron-tim.log
    /usr/sbin/service avahi-daemon restart
    /usr/sbin/service cups restart
    /usr/sbin/cupsenable Dai_Nippon_Printing_DS40
fi

Замените "DS40" тем принтером, состояние которого вы ищете, а "отключен" - тем, что выводит lpstat -p на вашем языке.

-1

Как уже говорили другие, «cupsenable» или «lpadmin -E» должны помочь.

С этим связана проблема IIRC, которая по умолчанию CUPS настраивает принтер таким образом, что если печать задания не выполняется, принтер отключается. Вы можете изменить это, чтобы прервать работу.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .