Come riprendere la stampante CUPS dalla riga di comando?


42

Ho una stampante in CUPS che a causa di problemi del driver (HP 1010) di tanto in tanto va in pausa.

Vorrei scrivere uno script di shell che verrà eseguito una volta all'ora per riprendere una stampante in CUPS. Ma non ho idea dopo aver cercato su Google per un paio di minuti come riprendere la stampante dalla riga di comando della shell.


Cosa sta causando questo: per uno, quando la mia stampante wifi è spenta sembra cancellare il flag Abilitato. Anche quando si riavvia la stampante, il flag Abilitato non viene ripristinato per essere verificato. .. --- I lavori verranno quindi accumulati nella coda di stampa. Il messaggio di errore è "filtro non riuscito". Quando seleziono questa casella nelle impostazioni della stampante, la stampante riprende a stampare.
Vista ellittica

Risposte:


66

C'è il comando cupsenable.

cupsenable printer

avvia una stampante disabilitata (per scoprire il printername è possibile elencare le stampanti con lpstat -po lpc status).

Potrebbe essere necessario eseguire il comando come root o tramite sudo. Quindi, se devi abilitare la stampante in uno script di shell, dovresti aggiungere la shell al crontab di root o modificare il tuo file sudoers.


1
+1 a questa risposta in contrapposizione al "usa la configurazione delle tazze esagerate" (come in superuser.com/a/280400/160771 ), mi ha davvero aiutato. Anche il punto è più evidente, poiché OP voleva conoscere la linea di comando
umanità e

25

Il problema potrebbe essere risolto in diversi modi, a seconda della versione di CUPS in uso.

  1. Le versioni più recenti di CUPS (versione 1.2 e successive) sono dotate di una funzionalità integrata che potrebbe essere utile qui. Si chiama "ErrorPolicy". L'impostazione predefinita è selezionata in cupsd.conf e determina come cupsd dovrebbe gestire le code di stampa che non si comportano come previsto. Hai 3 opzioni per taggare individualmente ogni coda:

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

    Spiegazione:

    • abort-job
      - Annullare questo lavoro e procedere con il lavoro successivo nella stessa coda

    • retry-job
      - Riprovare questo lavoro dopo aver atteso N secondi (dove N è determinato dalla direttiva "JobRetryInterval" di cupsd.conf).

    • retry-this-job
      - Riprovare il lavoro corrente immediatamente e indefinitamente.

    • stop-printer
      - Arresta la coda di stampa corrente e conserva il lavoro per la stampa futura. Questo è ancora il valore predefinito, a meno che tu non definisca diversamente secondo le alternative sopra menzionate. È stato anche il comportamento predefinito + possibile solo per tutte le code nelle versioni precedenti di CUPS (quello di cui vuoi sbarazzarti secondo la tua domanda).

    Inoltre, è possibile impostare singoli ErrorPolicies su ciascuna coda di stampa separata. Questa impostazione verrebbe annotata nel file printers.conf. (Impostalo da una riga di comando con lpadmin -p printername -o printer-error-policy=retry-this-job).

  2. Per le versioni precedenti di CUPS , consiglierei di dare un'occhiata al gestore BackEndbeh CUPS . è un wrapper che può essere applicato a qualsiasi back-end CUPS.beh

    Supponendo che la tua coda di stampa abbia attualmente definito un back-end socket://192.168.1.111:9100e si comporti nel modo che non ti piace (disabilitata di volta in volta da cupsd a causa di problemi di connessione alla rete). Con la behridefinizione del backend in questo modo:

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

    Ciò riproverà un lavoro 20 volte in intervalli di due minuti e disabiliterà la coda solo quando ancora non riesce. Oppure potresti farlo:

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

    Ciò riprova il lavoro 3 volte con 5 secondi di ritardo tra i tentativi. Se il processo continua a non riuscire, viene eliminato, ma la coda non viene disabilitata. Vuoi lasciare che cupsd provi indefinitamente a connettersi al dispositivo? Bene, prova questo:

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

    Prova all'infinito fino a quando la stampante non ritorna. Gli intervalli tra i tentativi di connessione sono di 30 secondi. Il lavoro non va perso quando la stampante è spenta. È possibile ritardare intenzionalmente la stampa semplicemente spegnendo la stampante. Una buona configurazione per stampanti desktop e / o utenti domestici.


In generale, non c'è bisogno di pasticciare con script bash, cron jobs, lpadmin, cupsenableo sudoal fine di riattivare CUPS code di andare giù in modo irregolare.


Come possiamo impostare l'intervallo di tentativi per le versioni più recenti di CUPS?
Sepero,

@Sepero: Sì. Ad esempio: puoi provare JobRetryInterval 58a provare ogni 58 secondi. Altri valori possibili sono 1w(1 settimana), 3d(3 giorni), 7h(7 ore) o 4m(4 minuti).
Kurt Pfeifle,

@Sepero: tutti i possibili cupsd.confparametri fino a CUPS v1.7 sono documentati qui: http://www.cups.org/documentation.php/doc-1.7/ref-cupsd-conf.html . Controlla le annotazioni per ciascun parametro sul bordo destro della pagina: ti dirà quale versione CUPS è stata la prima a supportarlo. Buona scoperta di parametri più utili! :-)
Kurt Pfeifle

8

L' -Eopzione stampante utilizzata con lpadmindovrebbe farlo. Probabilmente puoi semplicemente creare un lavoro cron con il lpadmincomando.

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

cronIngresso orario :

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

Puoi aggiungerlo eseguendo:

sudo crontab -e

Assicurati di aggiungere il -Edopo il nome della stampante, perché qui è un'opzione stampante, non un'opzione lpadmin. Nota il seguente estratto dalla man lpadminpagina che è stata sottolineata in un commento qui sotto:

Se specificato prima delle opzioni -d, -p o -x, l'opzione -E forza la crittografia durante la connessione al server.


2
Questo è sbagliato. -E in questo contesto è un'opzione di stampante e deve andare DOPO il nome della stampante, altrimenti si sta solo attivando la crittografia delle comunicazioni. developer.apple.com/library/mac/documentation/Darwin/Reference/… - Se specificato prima delle opzioni -d, -p o -x, l'opzione -E forza la crittografia durante la connessione al server.
scragar

Questa è l'unica soluzione che funziona per me. tazze continua a mettere in pausa la stampante senza motivo abbastanza spesso. Il error-policynon risolve nulla. cupsenablenon aggiusta nulla. Fa solo lpadminper me.
λuser

6

La mia stampante è HP CP1215 ha avuto anche un errore: Stampante in pausa - "/ usr / lib / cups / backend / hp fallito"

Dopo aver riavviato entrambi cupse avahi-daemonidentificato la stampante con lpstat -pe abilitato con cupsenable, sono stato in grado di stampare di nuovo. Il riavvio cupse l'abilitazione non hanno funzionato.

Ho anche cambiato la politica di default in retry-job e alla fine ho finito per evitare errori in futuro con cronjob:

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

dove si poissa käytöstätrova il testo di localizzazione finlandese per manutenzione "fuori servizio" ed HP_Tuloostinè il nome della mia stampante.

In base alla mia esperienza, sia i criteri predefiniti che quelli correnti della stampante devono essere configurati per essere ritentati. La politica predefinita è solo la politica che si ottiene quando si installa una nuova stampante.


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

Questo elenca tutti i file PPD che rappresentano una stampante installata, interrompe l'estensione PPD, ignora un PPD VMware incluso in molti server VMware (se non è necessario semplicemente rimuoverlo |grep -v VMware) e passa gli altri nomi ai xargsquali non viene sospeso tutto le stampanti.

Un cron job dovrebbe farlo funzionare bene.


1

Se il problema è dovuto al fatto che la GUI richiede un accesso per riprendere la stampante, un'altra soluzione è consentire il riavvio della stampante tramite la GUI senza accesso. Per fare ciò spegnere le tazze e modificare questa riga 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 rimuovere la Resume-Printerdirettiva, quindi riavviare le tazze. Se la direttiva appare su più di una <Limit>sezione, è possibile rimuoverla dalla relativa <Policy>sezione o rimuovere da tutto. Ora dovresti essere in grado di riprendere la stampante senza un login dalla GUI. L'ho visto su macworld ma si applica a qualsiasi installazione di tazze.


1

La risposta di Janne sopra, ad esempio questa:

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

... causerà il riavvio di CUPS ogni minuto, indipendentemente dallo stato in cui si trova una stampante. Questo perché la clausola di riavvio di cups non è accoppiata con &&.

Ecco un breve script BASH che ho usato per subordinare il riavvio di CUPS al rilevamento di uno stato di errore.

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

Sostituisci "DS40" con qualunque stampante tu stia cercando lo stato e "disabilitato" con qualsiasi output lpstat -p nella tua lingua.


0

Ho aggiornato cupsd.conf con la riga:

ErrorPolicy abort-job

Quindi ho riavviato cupsd usando: /etc/init.d/cups restart

Ma quando guardo il file printers.conf, ErrorPolicy non viene aggiornato. Secondo la documentazione relativa alle tazze, nella sezione stampante deve apparire la riga "ErrorePolicy interruzione lavoro".

Ho anche provato con lpadmin per aggiornare ErrorPolicy. Nulla cambia ErrorPolicy o non lo fa nel file printers.conf.

Cosa mi sto perdendo? Come posso assicurarmi che cupsd interrompa effettivamente un lavoro per errore?


edit printers.conf
KawaiKx,

0

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

fonte


5
Ti interessa spiegare cosa fa esattamente? Aggiungi un po 'più di contesto.
slhck,

0

Un sacco di soluzioni qui non ha funzionato per me (ad esempio sudo cupsenable e lpadmin -E).

Se stai usando Debian 8.6, Cinnamon 2.2.16 (Linux) fallo dal menu di avvio della 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. 

Per Ubuntu 16.04:

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

Questo apre lo strumento di risoluzione dei problemi di stampa. Ti dirà cosa fare dopo.

Probabilmente dovrai solo controllare la proprietà Abilitato per la tua stampante CUPS nelle Impostazioni di stampa. (Dovrai prima sbloccare).

Infine, per evitare che ciò accada di nuovo, modificare il "criterio" delle stampanti in "riprovare-lavoro" nell'impostazione della stampante menzionata sopra (in proprietà | criteri).

Risolto il problema per me!

Cosa causa questo problema: se la mia stampante wifi si spegne quando stampo su una STAMPANTE CUPS e il mio criterio è "ferma stampante", viene visualizzato un messaggio che non è stato possibile stampare e la stampante è disabilitata (Abilitato non selezionato) . Solo se il criterio è impostato su "Riprova processo", Abilitato non verrà deselezionato. Pochi minuti dopo il riavvio della stampante, i lavori inizieranno a stampare.

(L' altro mio post su questo.)


0

Dovevo affrontare la stessa assurdità di CUPS qui ... La soluzione per me era uno script systemd che viene eseguito ogni n minuti.

/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

Come altri hanno già detto, 'cupsenable' o 'lpadmin -E' dovrebbero fare il trucco.

Un problema correlato è IIRC che per impostazione predefinita CUPS configura la stampante in modo tale che se la stampa di un lavoro fallisce in qualche modo, la stampante è disabilitata. È possibile modificarlo per interrompere il lavoro.


-1 come -E è per la crittografia.
Vista ellittica

Scopri come utilizzare correttamente -E come opzione stampante, non come opzione lpadmin, in un'altra risposta sopra.
Vista ellittica
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.