Como retomar a impressora CUPS na linha de comando?

42

Tenho uma impressora no CUPS que, devido a problemas no driver (HP 1010), de tempos em tempos entra em pausa.

Gostaria de escrever um shell script que será executado uma vez por hora para retomar uma impressora no CUPS. Mas, depois de pesquisar por alguns minutos, no Google, como retomar a impressora a partir da linha de comando do shell.

Stani
fonte
O que está causando isso: Por um lado, quando minha impressora wifi está desligada, o sinal de ativação foi desativado. Mesmo quando a impressora é ligada novamente, o sinalizador Ativado não é restaurado para marcado. .. --- Os trabalhos serão empilhados na fila de impressão. A mensagem de erro é "Falha no filtro". Ao marcar esta caixa nas configurações da impressora, a impressora começa a imprimir novamente.
Visualização elíptica

Respostas:

66

Existe o comando cupsenable.

cupsenable printer

inicia uma impressora desativada (para descobrir o nome da impressora com o qual você pode listar suas impressoras lpstat -pou lpc status).

Pode ser necessário executar o comando como root ou através do sudo. Portanto, se você tiver que ativar a impressora em um script de shell, será necessário adicionar o shell ao crontab do root ou editar o arquivo sudoers.

David V.
fonte
1
Marque esta resposta com +1, em contraste com a configuração "use the overbloated cups" (como em superuser.com/a/280400/160771 ), realmente ajudou. Também o seu mais direto ao ponto, uma vez OP queria saber linha de comando
humanityANDpeace
25

Seu problema pode ser resolvido de diferentes maneiras, dependendo da versão do CUPS que você está executando.

  1. As versões mais recentes do CUPS (versão 1.2 e superior) vêm com uma funcionalidade integrada que pode ajudar aqui. É chamado "ErrorPolicy". Sua configuração padrão é selecionada no cupsd.conf e determina como o cupsd deve lidar com as filas de impressão que não se comportam conforme o esperado. Você tem três opções para marcar individualmente cada fila:

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

    Explicação:

    • abort-job
      - Interrompa este trabalho e prossiga com o próximo trabalho na mesma fila

    • retry-job
      - Tente novamente este trabalho após aguardar N segundos (onde N é determinado pela diretiva "JobRetryInterval" de cupsd.conf).

    • retry-this-job
      - Repita o trabalho atual imediata e indefinidamente.

    • stop-printer
      - Interrompa a fila de impressão atual e mantenha o trabalho para impressão futura. Esse ainda é o padrão, a menos que você defina o contrário, de acordo com as alternativas acima mencionadas. Também era o padrão + apenas o comportamento possível para todas as filas nas versões anteriores do CUPS (aquela que você deseja eliminar conforme sua pergunta).

    Além disso, você pode definir ErrorPolicies individuais para cada fila de impressão separada. Essa configuração seria observada no arquivo printers.conf. (Defina-o em uma linha de comando com lpadmin -p printername -o printer-error-policy=retry-this-job).

  2. Para versões mais antigas do CUPS, eu recomendaria dar uma olhada beh, o CUPS BackEnd Handler . behé um invólucro que pode ser aplicado a qualquer back-end do CUPS.

    Supondo que sua fila de impressão atualmente tenha definido um backend de socket://192.168.1.111:9100, e ela se comporte da maneira que você não gosta (sendo desativada pelo cupsd de tempos em tempos devido a problemas de conexão de rede). Com behvocê redefiniria seu back-end assim:

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

    Isso tentaria novamente um trabalho 20 vezes em intervalos de dois minutos e desativaria a fila apenas quando ainda não tivesse êxito. Ou você pode fazer isso:

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

    Isso tenta o trabalho novamente três vezes com atrasos de 5 segundos entre as tentativas. Se o trabalho ainda falhar, ele será descartado, mas a fila não está desabilitada. Deseja permitir que o cupsd tente indefinidamente se conectar ao dispositivo? Bom, tente o seguinte:

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

    Tente infinitamente até a impressora voltar. Os intervalos entre as tentativas de conexão são de 30 segundos. O trabalho não se perde quando a impressora está desligada. Você pode atrasar intencionalmente a impressão simplesmente desligando a impressora. Uma boa configuração para impressoras de mesa e / ou usuários domésticos.


No geral, não há necessidade de mexer com scripts bash, cron jobs, lpadmin, cupsenableou sudoa fim de reativar CUPS filas indo para baixo de forma irregular.

Kurt Pfeifle
fonte
Como podemos definir o intervalo de novas tentativas para versões mais recentes do CUPS?
Sepero 4/02/15
@Sepero: Sim. Por exemplo: você pode tentar JobRetryInterval 58tentar a cada 58 segundos. Outros valores possíveis são 1w(1 semana), 3d(3 dias), 7h(7 horas) ou 4m(4 minutos).
Kurt Pfeifle #
@Sepero: Todos os cupsd.confparâmetros possíveis até o CUPS v1.7 estão documentados aqui: http://www.cups.org/documentation.php/doc-1.7/ref-cupsd-conf.html . Verifique as anotações para cada parâmetro na borda direita da página: ele informará qual versão do CUPS foi a primeira a suportá-la. Feliz descoberta de parâmetros mais úteis! :-)
Kurt Pfeifle
8

A -Eopção de impressora usada com lpadmindeve fazer isso. Provavelmente, você pode apenas criar um trabalho cron com o lpadmincomando

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

cronEntrada horária :

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

Você pode adicionar isso executando:

sudo crontab -e

Certifique-se de adicionar o -Enome após a impressora, porque é uma opção de impressora aqui, não uma opção lpadmin. Observe o seguinte trecho da man lpadminpágina, apontado em um comentário abaixo:

Quando especificada antes das opções -d, -p ou -x, a opção -E força a criptografia ao se conectar ao servidor.

Pausado até novo aviso.
fonte
2
Isto está errado. -E, neste contexto, é uma opção de impressora e deve APÓS o nome da impressora, caso contrário, você está apenas ativando a criptografia de comunicação. developer.apple.com/library/mac/documentation/Darwin/Reference/… - Quando especificada antes das opções -d, -p ou -x, a opção -E força a criptografia ao se conectar ao servidor.
scragar
Esta é a única solução que funciona para mim. os copos continuam pausando a impressora sem motivo, com muita frequência. O error-policynão conserta nada. cupsenablenão conserta nada. Só lpadminfaz por mim.
λuser
6

Minha impressora é HP CP1215 também teve um erro: Impressora em pausa - "/ usr / lib / cups / back-end / hp falhou"

Depois de reiniciar ambos cupse avahi-daemone identificar impressora com lpstat -pe permitindo com cupsenable, eu era capaz de imprimir novamente. Reiniciar apenas cupse ativar não funcionou.

Também mudei a política padrão para nova tentativa e, finalmente, acabei evitando erros no futuro com o cronjob:

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

onde poissa käytöstäestá o texto de localização finlandês para manutenção "fora de ordem" e HP_Tuloostiné o nome da minha impressora.

Na minha experiência, a política padrão e as políticas atuais da impressora devem ser configuradas para serem repetidas. A política padrão é apenas a política que você obtém ao instalar uma nova impressora.

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

Isso lista todos os arquivos ppd que representam uma impressora instalada, corta a extensão ppd, ignora um ppd do VMware incluído em muitos servidores VMware (se você não precisar apenas remover |grep -v VMware) e passa os outros nomes aos xargsquais despausa todos as impressoras.

Um trabalho cron deve fazer esse trabalho bem.

Dana M
fonte
1

Se o problema se dever ao fato de a GUI exigir um login para reiniciar a impressora, outra solução é permitir a retomada da impressora através da GUI sem um login. Para fazer isso, desligue os copos e edite esta linha 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>

E remova a Resume-Printerdiretiva e reinicie os copos. Se a diretiva aparecer em mais de uma <Limit>seção, você poderá removê-la da <Policy>seção relevante ou remover de todas. Agora você deve conseguir reiniciar a impressora sem fazer login na GUI. Eu vi isso no macworld, mas se aplica a qualquer instalação de copos.

Pierz
fonte
1

A resposta de Janne acima, por exemplo:

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

... fará com que o CUPS seja reiniciado a cada minuto, independentemente do estado de qualquer impressora. Isso ocorre porque a cláusula cups restart não está emparelhada com o &&.

Aqui está um pequeno script BASH que eu usei para condicionar a reinicialização do CUPS à detecção de um estado de falha.

#!/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

Substitua "DS40" por qualquer impressora que esteja procurando pelo status e "desabilitado" por quaisquer saídas lpstat -p em seu idioma.

xaphod
fonte
0

Atualizei cupsd.conf com a linha:

ErrorPolicy abort-job

Então reiniciei o cupsd usando: /etc/init.d/cups restart

Mas quando olho para o arquivo printers.conf, o ErrorPolicy não é atualizado. De acordo com a documentação dos copos, a linha "ErrorPolicy abort-job" deve aparecer na seção da impressora.

Eu também tentei com o lpadmin atualizar o ErrorPolicy. Nada altera o ErrorPolicy ou não o faz no arquivo printers.conf.

o que estou perdendo? Como garantir que o cupsd realmente interrompa um trabalho por erro?


fonte
edit printers.conf
KawaiKx
0

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

Fonte

vserg
fonte
5
Importa-se de explicar exatamente o que isso faz? Por favor, adicione um pouco mais de contexto.
slhck
0

Várias soluções aqui não funcionaram para mim (por exemplo, sudo cupsenable e lpadmin -E).

Se você estiver usando o Debian 8.6, o Cinnamon 2.2.16 (Linux) faça isso no menu Iniciar da GUI:

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. 

Para o Ubuntu 16.04:

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

Isso abre a solução de problemas de impressão. Ele lhe dirá o que fazer em seguida.

Provavelmente, você só precisará verificar a propriedade Ativado da sua impressora CUPS nas Configurações de impressão. (Você precisará desbloquear primeiro).

Por fim, para evitar que isso aconteça novamente, altere a "política" da impressora para "nova tentativa" na configuração da impressora mencionada acima (em propriedades | políticas).

Corrigido para mim!

O que causa esse problema: Se minha impressora wifi é desligada quando imprimo em uma IMPRESSORA DO CUPS e minha política é "parar a impressora", recebo uma mensagem que não foi possível imprimir e a impressora está desativada (Ativado está desmarcado) . Somente se a política estiver definida como "repetir trabalho", a opção Ativado não será desmarcada. Alguns minutos após a impressora ser ligada, seus trabalhos começarão a ser impressos.

(Meu outro post sobre isso.)

Vista elíptica
fonte
0

Tive que lidar com o mesmo absurdo do CUPS aqui ... A solução para mim foi um script systemd que é executado a cada n minutos.

/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
Jonathan Komar
fonte
-1

Como outros já disseram, 'cupsenable' ou 'lpadmin -E' deve fazer o truque.

Um problema relacionado é o IIRC que, por padrão, o CUPS configura a impressora, de modo que, se a impressão de um trabalho falhar de alguma forma, a impressora será desativada. Você pode alterar isso para cancelar o trabalho.

janneb
fonte
-1 como -E é para criptografia.
Visualização elíptica
Veja como usar -E corretamente como uma opção de impressora, não como uma opção lpadmin, em outra resposta acima.
Visualização elíptica