CUPS – Como Depurar Incidencias de Impresora

Brandon Nielsen, Zdenek Dohnal Versión F35 onwards Last review: 2022-02-10

Si tiene algún problema con la impresión, consulte la página errores comunes antes de reportar un error. Si el problema que observa no aparece en la lista o ninguna de las soluciones alternativas parece solucionarlo, considere presentar un informe de error para ayudarnos a mejorar el rendimiento de Fedora en su hardware.

Identificar su área del problema

Las incidencias de impresión pueden ser muy complejos y una cooperación activa o una gran cantidad de datos pueden ser pedidos por el mantenedor al informador para ayudar al mantenedor a por lo menos entender y (si no es una incidencia específica de hardware) reproducir la incidencia, de modo que por favor tenga paciencia e intente centrar el problema tanto como sea capaz.

Puede haber:

  • incidencias para ver o conectarse a la impresora (pueden ser incidencias de back-end de cups, incidencias de avahi, incidencias de libusb, incidencias de búsqueda de cups),

  • incidencias de accesibilidad (configuración correcto/incorrecta en cupsd.conf o su interpretación errónea por el demonio cupsd, mala cooperación con NIS, SSSD…​),

  • imprimir con ayuda de samba (incidencias con el backend smb, que es parte de samba) o con samba autenticado a través de Kerberos (samba_krb5_printing),

  • incidencias con los filtros utilizados durante el filtrado del documento en un formato compatible con la impresora, que influyen en cómo o si se imprimirá el documento (incidencia con filtros: pdftops, pdftopdf, pstops, bannertopdf, etc., o incidencias con binarios o bibliotecas que utilizan los filtros: libgs, qpdf, poppler…​),

  • incidencias con los archivos de descripción de impresora Postscript, que son una forma antigua de definir las capacidades de las impresoras, como tamaños de página admitidos, bordes, etc.

Sin mencionar posibles limitaciones o incidencias en el firmware o hardware de la impresora en sí, por lo que cualquier tipo de dato o acotación de la incidencia es bienvenido.

El mejor comienzo es adjuntar archivos con los registros que se describen más adelante.

Acceso a CUPS

Todos los accesos a CUPS es redireccionado al diario por defecto desde Fedora 28 (hubo una redirección de error_log para diario por defecto antes de Fedora 28).

Necesitamos definir dos formas diferentes de capturar registros completos de CUPS vinculados a bitácoras: no se proporciona una si la cola de impresión rota de HPLIP y sí si la otra lo es. Se diferencian en la opción de filtro de journald: si usa una cola que no sea HPLIP para depurar, está bien recopilar los registros de la unidad systemd de cups (mediante '-u cups'), porque todos los mensajes de error se redirigen correctamente al registro de la unidad systemd de cups y son accesibles en la salida después del filtrado de la unidad. Las bibliotecas HPLIP no están implementadas para hacer lo mismo (el servidor original no responde para aceptar una posible solución en el proyecto y el problema no es lo suficientemente crítico como para retrasar indefinidamente la implementación de un parche posterior), por lo que sus mensajes no se marcan para la unidad systemd de cups y se filtran tras llamar a journald con '-u cups'. Para estas colas, se requiere el registro de journald sin filtrado.

El registro journald vinculado a incidentes sin filtrado solo es necesario para las colas de impresión HPLIP (cuyo URI de dispositivo empieza por hp://) y no es recomendable para otras colas, ya que puede ser difícil de leer en casos grandes. Adjunte el registro journald vinculado a incidentes solo cuando sea necesario.

Ubicación del registro de CUPS

El registro de CUPS se encuentra en el diario del sistema por defecto, pero se puede configurar el registro en un archivo en /etc/cups/cups-files.conf con la directiva ErrorLog. Si desea cambiar la configuración predeterminada, el nombre del archivo de registro es irrelevante, pero se recomienda colocarlo en la ruta /var/log/cups; de lo contrario, SELinux impedirá que cupsd acceda a él.

Establecer el registro en un archivo tiene las siguientes desventajas (sin operaciones adicionales):

  • no es posible conectar solo los registros a un trabajo sin encadenar más comandos

  • no se pueden obtener registros para el período de tiempo especificado sin encadenar más comandos

Para capturar registros vinculados a incidentes, se puede utilizar tail -f, por ejemplo:

$ tail -f /var/log/cups/error_log

Habilitar el registro de depuración de CUPS

Habilite la información de depuración completa con:

$ cupsctl LogLevel=debug2

Registro de trabajos de CUPS

Si el problema aparece al enviar el documento a imprimir o al intentarlo, capture los registros de este trabajo. Si el registro del trabajo está disponible, es OBLIGATORIO adjuntarlo.

Preparar CUPS para el registro de trabajos

Para poder ver el registro de trabajos específicos, active:

PreserveJobFiles Yes

En su archivo /etc/cups/cupsd.conf y reinicie el servicio cup. No olvide eliminar la línea después de terminar la depuración. El comando lpstat -W all parece estar vacío después de imprimir si no habilita la directiva.

Obtener un registro de tarea para un ID de tarea específica

Para capturar el registro de tarea, necesita saber el ID de trabajo (JID) de la tarea: es el número después del guion en un ID de solicitud:

El ID de solicitud se ve así:

<print_queue_name>-<JID>

y puede ser visto en terminal si envía un documento para imprimir por la instrucción lp:

$ lp -d <print_queue_name> <file1> ... <fileN>
request id is <print_queue_name>-<JID> (N archivo(s))

O cuando enumere tareas (consulte man lpstat); la última tarea está al final:

$ lpstat -W all
...
<print_queue_name>-<JID>           <usuario>           1024   Wed 11 Jan 2017 05:52:19 PM CET

Puede obtener la última tarea de bitácoras automáticamente (si tiene awk instalado y lpstat -W todas las tareas devueltas) por:

$ journalctl -u cups JID=`lpstat -W all | awk '{print $1}' | awk -F '-' '{print $NF}' | tail -n 1` > cups_job_log

O manualmente, si encuentra JID por usted mismo:

$ journalctl -u cups JID=<JID> > cups_job_log

Registro de cupsd vinculado a incidentes (la cola de impresión rota no es compatible con HPLIP)

A veces no podemos vincular el error a una tarea de impresión específico, por lo que el registro de tareas no es efectivo. Se requiere un registro de cupsd vinculado a incidentes.

Como comenzar para capturar vínculo-incidencia de bitácora de cups

En terminal/lengüeta de terminal nueva, declare:

$ journalctl -f -u cups > cups_whole_log
Cómo obtener el registro de cupsd vinculado a incidentes

Después de activar la condición de error que está intentando diagnosticar, por ejemplo, imprimir algo, intentar encontrar una impresora mediante lpinfo, etc., finaliza la captura del registro cupsd vinculado al incidente desde paso anterior con <ctrl>+<c>.

Registro de cupsd vinculado a incidentes (la cola de impresión rota es compatible con HPLIP)

Lamentablemente, las bibliotecas HPLIP no inician sesión en la unidad CUPS en el diario, por lo que si su cola de impresión está instalada con el controlador HPLIP (su URI de dispositivo comienza con hp://), necesitamos un registro de diario vinculado a incidentes.

Cómo empezar a capturar registros de diario vinculados a incidentes

En terminal/lengüeta de terminal nueva, declare:

$ journalctl -f > journal_whole_log
Cómo obtener un registro de diario vinculado a incidentes

Después de activar la condición de error que está intentando diagnosticar, por ejemplo, imprimir algo, ejecutar un script de HP, etc., finaliza la captura del registro de diario vinculado a incidentes desde paso anterior con <ctrl>+<c>.

Apaga bitácora depurativa

Adjunte cups_job_log para la tarea problemática, cups_whole_log o journal_log si capturó todo el registro de cupsd durante el evento problemático, informe el error como un archivo adjunto.

Entonces para apagar la información de depuración, haga esto:

$ sudo sed -i 's,LogLevel debug2,LogLevel warn,' /etc/cups/cupsd.conf
$ sudo systemctl restart cups

Más instrucciones para funcionar con systemd-journald

Consulte los mensajes de bitácora con:

$ journalctl -u cups -e

o:

$ journalctl -u cups --since=...

Para filtrar los mensajes relacionados con un ID de tarea específico, utilice:

$ journalctl -u cups JID=...

(al completar la pestaña se le mostrará qué ID de tarea tienen mensajes de bitácora)

registro de cups-browsed

El demonio cups-browsed se introdujo en Fedora alrededor de la versión cups-1.5. Puede explorar transmisiones Bonjour, transmisiones CUPS (obsoletas) y servidores LDAP en busca de impresoras, y crear o eliminar colas locales que apunten a dichas impresoras. Puede crear transmisiones de colas CUPS locales, pero está marcado como obsoleto.

Para configurar el registro de depuración, debe agregar:

DebugLogging stderr

al /etc/cups/cups-browsed.conf.

Las bitácoras estarán disponibles en el diario del sistema tras reiniciar cups-browser.

Guiones HPLIP depurativos de bitácora

Los scripts de Python de HPLIP (p. ej., hp-setup, hp-clean, hp-scan) tienen el registro de depuración redirigido al descriptor de archivo de error estándar, por lo que no se registran en el diario. Para obtener el registro de depuración, ejecute el script con el parámetro -ldebug, p. ej.:

$ hp-setup -ldebug -i

y reproduce el tema. Entonces copie los mensajes desde el terminal al hp_script_log. Adjunte el archivo al ticket de bugzilla también.

¿Qué marca y modelo es mi impresora?

Cada impresora diferente tiene un modelo-específico de ID Dispositivo. Puede encontrarlo con la instrucción lpinfo:

$ sudo lpinfo -l -v

Esta instrucción ejecuta cada backend en modo de descubrimiento para que informen sobre los dispositivos que pueden detectar automáticamente. Esto generará una serie de bloques de líneas, cada uno como éste:

Device: uri = usb://HP/DESKJET%20990C?serial=U123456789AB
        class = direct
        info = HP DESKJET 990C
        make-and-model = HP DESKJET 990C
        device-id = MFG:HEWLETT-PACKARD;MDL:DESKJET 990C;CMD:MLC,PCL,PML;CLS:PRI
NTER;DES:Hewlett-Packard DeskJet 990C;SN:U123456789AB;S:00808880800010032C100000
0C2000000;P:0800,FL,B0;J:                    ;
        location =

La línea que identifica este tipo de modelo en particular es la línea larga que comienza con "device-id =" (se muestra aquí en tres líneas).

Tenga en cuenta que si su impresora no se detecta automáticamente, aún puede averiguar el ID del dispositivo ejecutando el backend adecuado con el nombre de host de la impresora como argumento. Los backends usb, parallel, snmp y dnssd intentan informar el ID del dispositivo real proporcionado por la impresora.

$ /usr/lib/cups/backend/snmp 10.34.18.3

network socket://10.34.18.3 "HP Color LaserJet CP2025dn" "HP Color LaserJet CP2025dn"
"MFG:Hewlett-Packard;CMD:PJL,PML,PCLXL,POSTSCRIPT,PCL;MDL:HP Color LaserJet CP2025dn;
CLS:PRINTER;DES:Hewlett-Packard Color LaserJet CP2025dn;MEM:MEM=55MB;COMMENT:RES=600x8;" "HP Color LaserJet CP2025dn"

El ID del dispositivo es en este caso (consulte backend(7)) el penúltimo campo.

¿Cuáles colas de impresión están disponibles para mí?

Las colas de impresión de su máquina pueden ser permanentes o temporales. CUPS puede listar todas las colas de impresión disponibles en la red local (permanentes y temporales) por:

$ lpstat -e

Para colas permanentes puedes obtener más información con:

$ lpstat -t

¿Cual controlador estoy usando?

El archivo PPD de la cola de impresión le indica qué controlador está en uso. Puede usar esta instrucción para averiguarlo:

$ grep -H '^*NickName:' /etc/cups/ppd/*.ppd

También puede encontrar esto usando la aplicación system-config-printer. Pulse dos veces en el icono de la cola y mire el campo Marca y Modelo.

Para ver los controladores disponibles, pulse en el botón Cambiar…​ junto a ese campo. Quizás le resulte útil probar otro controlador para ver si presenta el mismo problema.

Modelos sin controlador

La mayoría de las impresoras lanzadas desde 2010 son compatibles con AirPrint o IPP Everywhere, lo que significa que no necesitan instalación para funcionar: Avahi detecta el dispositivo y las funciones de impresión se comunican mediante el protocolo IPP. Básicamente, son dispositivos sin controladores. Existen dos soluciones en Fedora que implementan IPP Everywhere:

  • Modelo CUPS 'en todas partes'

  • controlador 'sin conductor' de cups-filters

Modelo CUPS 'en todas partes'

Es una implementación CUPS del estándar IPP Everywhere, disponible como un modelo de impresora especial. Este modelo se utiliza al usar la cola temporal de CUPS para su dispositivo o al instalarlo con el modelo IPP Everywhere en la interfaz web de CUPS o mediante lpadmin (usando -m everywhere).

Dado que el archivo PPD creado depende de la comunicación IPP con la impresora, necesitamos información recopilada del dispositivo. Puede usar ipptool para eso:

$ ipptool --ippserver ipptool.attr <your_printer_device_uri> get-printer-attributes.test

Adjunte el ipptool.attr creado al ticket de Bugzilla si es necesario.

controlador 'sin conductor' de cups-filters

Controlador especial para filtros de cups que se utiliza para generar PPD según el estándar IPP Everywhere. Este controlador se utiliza si se selecciona el modelo sin controlador durante la instalación de la impresora.

También necesitamos la salida de la solicitud get-printer-attributes:

$ ipptool --ippserver ipptool.attr <your_printer_device_uri> get-printer-attributes.test

y registros de depuración del propio controlador cuando genera PPD para su dispositivo:

$ driverless -d cat <ipp_device_uri> 2> driverless_debug > created_ppd

Adjunte todos los archivos creados al ticket de Bugzilla si es necesario.

Encontrar dónde está el problema

Cuando se procesa un trabajo de impresión, este se envía a través de una cadena de filtros para convertir el archivo a un formato que la impresora pueda entender y, finalmente, se envía a un backend, un programa que puede transportar los datos a la impresora. Al modificar ligeramente la forma en que imprime, puede probar una ruta de impresión diferente para ver si cambia algo. Si soluciona el problema, sabrá en qué área se encontraba; incluya esa información en un informe de errores para que podamos solucionarlo.

Aplicaciones

Prueba imprimir desde una aplicación diferente para ver si el problema va fuera o si ocurre a toda costa de cómo un archivo esté imprimiéndose. Prueba imprimir el documento desde la línea de comando que utiliza el comando lp.

Formato del documento

Si eres teniendo problemas de impresión con archivos PDF, prueba imprimir otros tipos de archivos para ver si el problema es con cualquier problema con la impresora o si es concreto para imprimir archivos PDF. Prueba convertir el archivo a un formato diferente e imprimiendo eso.

Si el problema relativo a imprimir archivos de texto, prueba extraer/instalar el paquete paps. Este paquete proporciona un filtro alternativo de un filtro texto‐a‐PostScript a uno que viene con CUPS.

Para inspeccionar el documento que fue enviado a CUPS para imprimir, habilita la opción PreserveJobFiles como esto:

cupsctl PreserveJobFiles=yes

Tarea de documentos enviados con remanentes en /var/spool/cups. Hay archivos con dos tipos de nombres - dXXXXX-YYY y cXXXXX. dXXXXX-YYY es archivo el cual va al sistema CUPS, el archivo no filtrado - XXXXX es el ID de tarea, el cual es rellenado con ceros hasta que sean 5 caracteres de largo, y YYY el cual es el número de secuencia de archivo dentro de la tarea. cXXXXX es el archivo el cual contiene las opciones de la impresión para una tarea especificada por el ID de tarea en XXXXX. Adjunte dXXXXX-YYY al defecto para una tarea cuando experimente la incidencia

Ejecución de filtros a mano

Los usuarios más avanzados pueden intentar ejecutar los filtros CUPS manualmente y examinar el archivo de datos en cada paso a medida que se convierte entre diferentes formatos. Aquí hay un ejemplo de cómo hacerlo para una cola gutenprint llamada pqueue con la página de prueba CUPS, que tiene su propio tipo MIME especial application/vnd.cups-banner:

Primero necesita saber el conducto del filtro para application/vnd.cups-bannerprinter/pqueue (salida de tipo MIME). Puedes o bien habilitar depuración, imprimir una página fe prueba, obtener la bitácora de la tarea de CUPS y en cups_job_log encontrará algo similar a:

envp[29]="FINAL_CONTENT_TYPE=printer/pqueue"
Started filter /usr/lib/cups/filter/bannertopdf (PID 1111)
Started filter /usr/lib/cups/filter/pdftopdf (PID 1112)
Started filter /usr/lib/cups/filter/gstoraster (PID 1113)
Started filter /usr/lib/cups/filter/rastertogutenprint.5.2 (PID 1114)

o ejecuta

$ /usr/lib/cups/filter/bannertopdf 1 me '' 1 '' </usr/share/cups/data/testprint >bannertopdf.pdf
$ cupsfilter -e -m printer/pqueue -p /etc/cups/ppd/pqueue.ppd bannertopdf.pdf > /dev/null

y verá:

INFO: pdftopdf (PID 1111) started.
INFO: gstoraster (PID 1112) started.
INFO: rastertogutenprint.5.2 (PID 1113) started.

Esta canalización de filtros es de cups-1.6. Con cups < 1.6, puede ver bannertops → pstops → pstoraster.

Ahora puedes ejecutar filtros manualmente:

$ export PPD=/etc/cups/ppd/pqueue.ppd
$ /usr/lib/cups/filter/bannertopdf 1 me '' 1 '' </usr/share/cups/data/testprint >bannertopdf.pdf
$ /usr/lib/cups/filter/pdftopdf 1 me '' 1 '' <bannertopdf.pdf >pdftopdf.pdf
$ /usr/lib/cups/filter/pdftoraster 1 me '' 1 ''<pdftopdf.pdf >out.ras
$ /usr/lib/cups/filter/rastertogutenprint.5.2 1 me '' 1 ''<out.ras >out.prn

Aquí, se puede usar evince o okular para examinar la salida después de los primeros dos filtros, se puede usar rasterview para examinar la salida del tercer filtro y la salida del último filtro debe inspeccionarse manualmente o enviarse directamente (lpr -oraw out.prn) a la impresora.

Controlador

Si tiene acceso a una impresora de otra marca o modelo, podría valer la pena comprobar si el problema se produce en ambas o solo en una. Esto puede indicar si se trata de un problema con un controlador específico o si se trata de un problema más general.

Incluso si solo tiene acceso a una impresora, suele haber varios controladores disponibles para cada modelo, y probarlos uno por uno puede ser útil para identificar el problema. Consulte arriba para saber cómo hacer eso.

Foomatic

Para los controladores Foomatic, puede intentar habilitar la depuración de Foomatic editando el archivo /etc/foomatic/filter.conf y agregando una línea:

debug: 1

La próxima vez que imprima un trabajo en una cola utilizando foomatic, la depuración se colocará en /tmp/foomatic-rip.log, y el archivo de entrada recibido por foomatic-rip estará en /tmp/foomatic-rip.ps.

Backend (tarea transporte)

Quizás puedas probar un backend diferente. Utilizando [command] system-config-printer, pulse dos veces en el icono de la cola de impresión y pulsa el botón Cambiar…​ junto al campo URI del dispositivo. Verás una flecha de expansión de Conexión cerca de la esquina inferior derecha de la ventana; pulse en ella para ver los backends disponibles. Para impresoras HP con conexión USB, normalmente se pueden usar los backends hp y usb.

Para capturar la comunicación USB:

  • descubra el número de bus donde está conectado el dispositivo USB, por ejemplo:

$ lsusb
Bus 002 Device 010: ID 03f0:012a HP, Inc HP LaserJet M1536dnf MFP

      =
  • iniciar captura de paquete USB:

$ sudo tcpdump -i usbmonN -s0 -w usb.pcap

donde N es el número del bus.

Para las impresoras de red, es posible que tengas diferentes protocolos que puedes probar.

  • socket (zócalo) es para HP JetDirect (usualmente puerto 9100)

  • lpd es para recursos compartidos de impresión de UNIX de estilo antiguo

  • smb es para recursos compartidos CIFS de sistemas Windows

  • ipp es para dispositivos habilitados para el Protocolo de impresión de Internet y también para otros servidores CUPS — Puede capturar el tráfico IPP con tcpdump de esta manera (el nombre de la interfaz puede diferir de p4p1):

$ tcpdump -n -i p4p1 -U -s0 -w ipp.pcap port ipp
  • bjnp es para el protocolo de red bjnp propietario de Canon (normalmente el puerto 8611)

Herramienta de configuración

Si su problema está relacionado con la configuración de las colas de impresora, pruebe con uno de los otros métodos. Hay cuatro disponibles:

  • La aplicación Configuración del sistema de GNOME 3 (centro de control), Configuración del sistema > Impresoras desde GNOME Shell

  • system-config-printer, Sistema > Administración > Impresora desde el menú de GNOME

  • el interfaz de web CUPS, http://localhost:631/

  • las herramientas de línea de comandos lpadmin, lpoptions, cupsctl, cupsaccept, cupsenable etc.

Historias del usuario

Hay varias historias de usuario común cuando viene a depurar incidencias de impresión. Mencionaré algunos de ellos con los pasos para obtener información necesaria.

Tengo una impresora HP y tengo un problema con el script HPLIP

Siga los pasos de las secciones siguientes:

Tengo una impresora HP, instalada con HPLIP y tiene un problema con ella

HPLIP ha instalado una cola de impresora que tiene un uri de dispositivo comenzando con hp://.

Siga los pasos de las secciones siguientes:

Mi impresora no imprime correctamente o no imprime en absoluto, pero puedo ver la impresora en el cuadro de diálogo de impresión

Siga los pasos de las secciones siguientes:

Tema CUPS genérico

Para incidencias generales; la impresora no se encuentra, fallo de segmento; siga los pasos en las secciones siguientes (avahi-daemon debe ejecutar):

Mi impresora no imprime correctamente – Utilizar el modelo 'everywhere'

Siga los pasos de las secciones siguientes:

Tengo un problema genérico con el explorador de CUPS

Siga los pasos de las secciones siguientes:

$ journalctl -u cups-browsed -f > cups_browsed_log
  • desencadena la incidencia o espera hasta que el explorador‐cups dispara la incidencia él mismo

  • cancela cups-browsed y captura cupsd log

  • adjuntado creó archivos cups_whole_log y cups_browsed_log al ticket y apaga la bitácora del depurador

La impresora encontrada por cups‐browser no imprime o imprime mal

El historial más difícil del usuario – necesitamos saber como la cola de la impresora fue creada y como se comporta durante la impresión. La cola de impresora encontrada por cups-browser tiene un url del dispositivo comenzando con implicitclass://.

Siga los pasos:

$ journalctl -u cups-browsed -f > cups_browsed_queue_creation
  • proporciona cups-browsed algún tiempo para procesar encuentra dispositivos (depende sobre cuantos dispositivos tiene en la red local o cuantas colas de impresora están almacenadas en la ubicación puesta con la directiva BrowsePoll)

  • cancela cups-browser y las capturas de bitácora cupsd - guarda los archivos como cups_queue_creation y cups_browsed_queue_creation

Ahora necesitamos capturar las bitácoras durante la impresión:

$ journalctl -u cups-browsed -f > cups_browsed_printing