J'ai une imprimante dans CUPS qui passe de temps en temps en raison de problèmes de pilote (HP 1010).
J'aimerais écrire un script Shell qui s'exécutera une fois par heure pour relancer une imprimante dans CUPS. Mais je ne sais pas, après avoir cherché sur Google pendant quelques minutes, comment reprendre l’imprimante à partir de la ligne de commande Shell.
Il y a la commande cupsenable.
cupsenable printer
démarre une imprimante désactivée (pour connaître le nom de l'imprimante, vous pouvez répertorier vos imprimantes avec lpstat -p
ou lpc status
).
Vous devrez peut-être exécuter la commande en tant que root ou via Sudo. Donc, si vous devez activer l’imprimante dans un script Shell, vous devez ajouter le Shell à la crontab de la racine ou modifier votre fichier sudoers.
Votre problème peut être traité de différentes manières, selon la version de CUPS que vous utilisez.
Plus les versions récentes de CUPS (versions 1.2 et supérieures) sont livrées avec une fonctionnalité intégrée qui pourrait aider ici. Cela s'appelle "ErrorPolicy". Son paramètre par défaut est sélectionné dans cupsd.conf et détermine la manière dont cupsd doit gérer les files d'attente d'impression qui ne se comportent pas comme prévu. Vous avez 3 choix pour baliser individuellement chaque file d'attente:
ErrorPolicy abort-job
ErrorPolicy retry-job
ErrorPolicy retry-this-job
ErrorPolicy stop-printer
Explication:
abort-job
- Abandonnez ce travail et passez au travail suivant dans la même file d'attente
retry-job
- Réessayez ce travail après avoir attendu N secondes (où N est déterminé par la directive "JobRetryInterval" de cupsd.conf ).
retry-this-job
- Réessayez le travail en cours immédiatement et indéfiniment.
stop-printer
- Arrête la file d'impression en cours et conserve le travail pour une impression ultérieure. C'est toujours la valeur par défaut, sauf indication contraire indiquée ci-dessus. Il s'agissait également d'un comportement par défaut + uniquement possible pour toutes les files d'attente des versions précédentes de CUPS (celle dont vous souhaitez vous débarrasser conformément à votre question).
En outre, vous pouvez définir des politiques d'erreur individuelles pour chaque file d'attente d'impression distincte. Ce paramètre serait noté dans le fichier printers.conf. (Définissez-le à partir d'une ligne de commande avec lpadmin -p printername -o printer-error-policy=retry-this-job
).
Pour les anciennes versions de CUPS , je vous conseillerais de consulter beh
, le gestionnaire CUPS BackEnd Handler . beh
est un wrapper qui peut être appliqué à n'importe quel backend CUPS.
En supposant que votre file d'attente d'impression ait défini un backend de socket://192.168.1.111:9100
, il se comporte de la manière que vous n'aimez pas (il est désactivé de temps à autre par cupsd en raison de problèmes de connexion réseau). Avec beh
vous redéfiniriez votre backend comme ceci:
beh:/0/20/120/socket://192.168.1.111:9100
Ceci relance un travail 20 fois par intervalles de deux minutes , et désactive la file d'attente uniquement s'il ne réussit toujours pas. Ou vous pouvez faire ceci:
beh:/1/3/5/socket://192.168.1.111:9100
Ceci tente le travail 3 fois avec un délai de 5 secondes entre les tentatives. Si le travail échoue toujours, il est supprimé, mais la file d'attente est pas désactivé. Vous souhaitez laisser cupsd essayer indéfiniment de se connecter à l'appareil? Bien, essayez ceci:
beh:/1/0/30/socket://192.168.1.111:9100
Essayez jusqu'à ce que l'imprimante revienne. Les intervalles entre les tentatives de connexion sont de 30 secondes. Le travail n'est pas perdu lorsque l'imprimante est éteinte. Vous pouvez intentionnellement retarder l'impression en éteignant simplement l'imprimante. Une bonne configuration pour les imprimantes de bureau et/ou les utilisateurs à domicile.
Dans l’ensemble, il n’est pas nécessaire de manipuler les scripts bash, les tâches cron, lpadmin
, cupsenable
ou Sudo
pour réactiver les files d’attentes CUPS qui tombent de manière erratique.
L'option d'impression -E
utilisée avec lpadmin
devrait le faire. Vous pouvez probablement simplement créer un travail cron avec la commande lpadmin
.
lpadmin [-U username ] [ -h server[:port] ] -p printer option(s)
Entrée horaire cron
:
0 * * * * /usr/sbin/lpadmin -p your_printer -E
Vous pouvez ajouter cela en exécutant:
Sudo crontab -e
Assurez-vous d’ajouter le -E
après le nom de l’imprimante, car c’est une option d’imprimante ici, pas une option lpadmin. Notez l'extrait suivant de la page man lpadmin
qui a été souligné dans un commentaire ci-dessous:
Lorsqu'elle est spécifiée avant les options -d, -p ou -x, l'option -E force le cryptage lors de la connexion au serveur.
Mon imprimante est HP CP1215 avait également une erreur: Imprimante en pause - "/ usr/lib/cups/backend/hp échoué"
Après avoir redémarré cups
et avahi-daemon
, identifié l'imprimante avec lpstat -p
et activé avec cupsenable
, j'ai été en mesure d'imprimer à nouveau. Redémarrer uniquement cups
et l'activer n'a pas suffi.
J'ai également modifié la stratégie par défaut pour réessayer le travail et j'ai finalement évité des erreurs à l'avenir avec cronjob:
* * * * * lpstat -p |grep "poissa käytöstä" && service avahi-daemon restart; service cups restart; cupsenable HP_Tuloostin
où poissa käytöstä
est le texte de localisation finnois pour la maintenance "hors service" et HP_Tuloostin
est le nom de mon imprimante.
D'après mon expérience, les stratégies d'imprimante par défaut et les stratégies actuelles doivent être configurées pour être relancées. La stratégie par défaut est une stratégie que vous obtenez lorsque vous installez une nouvelle imprimante.
ls /etc/cups/ppd/ |cut -d "." -f1 |grep -v VMware |xargs -i cupsenable {}
Ceci répertorie tous les fichiers ppd qui représentent une imprimante installée, supprime l’extension ppd, ignore un ppd VMware inclus sur de nombreux serveurs VMware (si vous n’avez pas besoin de cela, supprimez simplement |grep -v VMware
) et passe les autres noms à xargs
qui annule la pause. toutes les imprimantes.
Un travail cron devrait rendre ce travail bien.
Si le problème vient du fait que l’interface graphique nécessite un identifiant pour relancer l’imprimante, une autre solution consiste à autoriser la reprise de l’imprimante via l’interface graphique sans identifiant. Pour ce faire, fermez les gobelets et modifiez cette ligne 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>
Et supprimez la directive Resume-Printer
, puis redémarrez cups. Si la directive apparaît dans plusieurs sections <Limit>
, vous pouvez la supprimer de la section <Policy>
appropriée ou la supprimer de toutes. Vous devriez maintenant pouvoir relancer l’imprimante sans vous connecter à partir de l’interface graphique. J'ai vu cela sur macworld mais cela s'applique à toutes les installations de cups.
J'ai dû faire face au même non-sens de CUPS ici ... La solution pour moi était un script systemd qui s'exécute toutes les n minutes.
#!/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
[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
[Unit]
Description=Run enable printers frequently to ensure connection difficulties are remedied.
[Timer]
OnBootSec=15min
OnUnitActiveSec=300
[Install]
WantedBy = timers.target
J'ai mis à jour cupsd.conf avec la ligne:
ErrorPolicy Abort-Job
Puis j'ai redémarré cupsd en utilisant: /etc/init.d/cups restart
Mais lorsque je regarde le fichier printers.conf, ErrorPolicy n'est pas mis à jour. Selon la documentation de cups, la ligne "ErrorPolicy abort-job" doit apparaître dans la section imprimante.
J'ai également essayé avec lpadmin de mettre à jour le ErrorPolicy. Rien ne modifie la ErrorPolicy ou ne le fait pas dans le fichier printers.conf.
Qu'est-ce que je rate? Comment puis-je m'assurer que cupsd annule un travail par erreur?
Certaines des solutions proposées ici ne fonctionnaient pas pour moi (par exemple, Sudo cupsenable et lpadmin -E).
Si vous utilisez Debian 8.6, Cinnamon 2.2.16 (Linux) utilisez le menu de démarrage de votre interface graphique:
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.
Pour Ubuntu 16.04:
Click System Settings | Printers,
Then Server | Settings,
Click the blue "Problems?" link.
Cela ouvre l'utilitaire de résolution des problèmes d'impression. Il vous dira quoi faire ensuite.
Il vous suffira probablement de vérifier la propriété Enabled de votre imprimante CUPS dans vos paramètres d'impression. (Vous devrez d'abord déverrouiller).
Enfin, pour éviter que cela ne se reproduise, remplacez la "stratégie" de l'imprimante par "nouvelle tentative de travail" dans la configuration de l'imprimante mentionnée ci-dessus (sous Propriétés | stratégies).
Corrigé pour moi!
Quelle est la cause de ce problème: Si mon imprimante Wi-Fi est hors tension lorsque j'imprime sur une IMPRIMANTE CUPS et que ma stratégie est "Arrêter imprimante", je reçois un message indiquant t imprimer et l’imprimante est désactivée (l’option Enabled est décochée). Ce n'est que si la stratégie est définie sur "Réessayer le travail" que l'option Activée ne sera pas décochée. Quelques minutes après la mise sous tension de l'imprimante, vos travaux vont commencer à être imprimés.
(Mon autre poste à ce sujet.)
lpadmin -p p-go-avtom2 -v p-go-avtom2 -E
La réponse de Janne ci-dessus, par exemple ce:
* * * * * lpstat -p |grep "poissa käytöstä" && service avahi-daemon restart; service cups restart; cupsenable HP_Tuloostin
... provoquera le redémarrage de CUPS toutes les minutes, quel que soit l'état de l'imprimante. C'est parce que la clause de relance de cups n'est pas associée à &&.
Voici un court script BASH que j’avais utilisé pour conditionner le redémarrage de CUPS à la détection d’un état d’échec.
#!/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
Remplacez "DS40" par l’imprimante dont vous souhaitez connaître l’état et "désactivée" par l’une des sorties lpstat -p dans votre langue.