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


42

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

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


Что является причиной этого: например, когда мой Wi-Fi принтер выключен, он, кажется, снимает флажок Enabled. Даже когда принтер снова включается, флаг «Включено» не восстанавливается. .. --- Затем задания будут накапливаться в очереди на печать. Сообщение об ошибке «фильтр не удалось». Когда я устанавливаю этот флажок в настройках принтера, принтер снова начинает печатать.
эллиптический вид

Ответы:


66

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

cupsenable printer

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

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


1
+1 этот ответ в отличие от «использовать конфигурацию overbloated cups» (как в superuser.com/a/280400/160771 ), действительно помог. Кроме того, это более
humanityANDpeace

25

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

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

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

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

  2. Для более старых версий CUPS я бы порекомендовал взглянуть на behCUPS 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 секунд. Задание не теряется при выключении принтера. Вы можете намеренно задержать печать, просто выключив принтер. Хорошая конфигурация для настольных принтеров и / или домашних пользователей.


В целом, нет необходимости возиться с Баш сценариев, хрон рабочих мест, lpadmin, cupsenableили sudoдля того , чтобы повторно активировать CUPS очереди спускаясь хаотично.


Как мы можем установить интервал повторения для более новых версий CUPS?
Сеперо

@Sepero: Да. Например: вы можете JobRetryInterval 58попробовать каждые 58 секунд. Другие возможные значения: 1w(1 неделя), 3d(3 дня), 7h(7 часов) или 4m(4 минуты).
Курт Пфайфл

@Sepero: Все возможные cupsd.confпараметры, вплоть до CUPS v1.7, описаны здесь: http://www.cups.org/documentation.php/doc-1.7/ref-cupsd-conf.html . Проверьте аннотации для каждого параметра в правом краю страницы: он скажет вам, какой выпуск 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 включает шифрование при подключении к серверу.


2
Это не правильно. -E в этом контексте является параметром принтера и должен указывать ПОСЛЕ имени принтера, в противном случае вы просто включаете шифрование связи. developer.apple.com/library/mac/documentation/Darwin/Reference/… - если задано перед параметрами -d, -p или -x, параметр -E принудительно шифрует соединение при подключении к серверу.
scragar

Это единственное решение, которое работает для меня. чашки постоянно останавливают принтер без всякой причины. error-policyНичего не исправить. cupsenableничего не исправить Только lpadminделает для меня.
λuser

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

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


1

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


0

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

ErrorPolicy abort-job

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

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

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

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


редактировать printers.conf
KawaiKx

0

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

Источник


5
Не хочешь объяснить, что это делает, точно? Пожалуйста, добавьте немного больше контекста.
Slhck

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

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

-1

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

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


-1 как -E для шифрования.
эллиптический вид

Посмотрите, как правильно использовать -E как параметр принтера, а не как параметр lpadmin, в другом ответе выше.
эллиптический вид
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.