Как возобновить работу принтера CUPS из командной строки?

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

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

13 ответов

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

cupsenable printer

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

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

Ваша проблема может быть решена по-разному, в зависимости от версии 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 определяется директивой "JobRetryInterval" cupsd.conf).

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

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

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

  2. Для более старых версий CUPS я рекомендую взглянуть на beh, обработчик CEPS BackEnd. 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, идущих беспорядочно.

-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 включает шифрование при подключении к серверу.

Мой принтер 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 это имя моего принтера.

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

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

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

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

Ответ от 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 на вашем языке.

Если проблема связана с тем, что для возобновления работы принтера для входа в GUI требуется вход в систему, тогда можно разрешить возобновление работы принтера через GUI без входа в систему. Для этого отключите чашки и отредактируйте эту строку 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, но это относится к любой установке чашек.

Некоторые решения здесь не сработали (например, 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, и моя политика - "остановить принтер", то я получаю сообщение, что не могу печатать, и принтер отключен ("Включено" не проверено), Только если для политики задано значение "Повторить задание", параметр "Включить" не будет отключен. Через несколько минут после включения принтера ваши задания начнут печататься.

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

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

ErrorPolicy abort-job

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

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

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

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

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

Источник

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

      sudo cupsaccept MY_PRINTER

Пришлось иметь дело с той же ерундой 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

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

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

Другие вопросы по тегам