Jak wznowić drukarkę CUPS z wiersza poleceń?

42

Mam drukarkę w CUPS, która z powodu problemów ze sterownikiem (HP 1010) od czasu do czasu się zatrzymuje.

Chciałbym napisać skrypt powłoki, który będzie wykonywany raz na godzinę, aby wznowić drukarkę w CUPS. Ale po kilku minutach Google nie mam pojęcia, jak wznowić drukarkę z wiersza poleceń powłoki.

Stani
źródło
Co to powoduje: Po pierwsze, gdy drukarka Wi-Fi jest wyłączona, wydaje się, że usuwa flagę Włączone. Nawet po ponownym włączeniu drukarki flaga Włączona nie jest przywracana do zaznaczonej. .. --- Zadania zostaną następnie ułożone w kolejce drukowania. Komunikat o błędzie to „filtr nieudany”. Kiedy zaznaczę to pole w ustawieniach drukarki, drukarka zacznie ponownie drukować.
Widok eliptyczny

Odpowiedzi:

66

Istnieje polecenie, które można ustawić jako cupsenable.

cupsenable printer

uruchamia wyłączoną drukarkę (aby znaleźć nazwę drukarki, możesz wyświetlić listę drukarek za pomocą lpstat -plub lpc status).

Może być konieczne uruchomienie polecenia jako root lub sudo. Więc jeśli musisz włączyć drukarkę w skrypcie powłoki, musisz dodać powłokę do crontab roota lub edytować plik sudoers.

David V.
źródło
1
+1 tej odpowiedzi w przeciwieństwie do „użyj konfiguracji przepełnionych filiżanek” (jak w superuser.com/a/280400/160771 ), naprawdę pomogło. Również jego bardziej na miejscu, ponieważ PO chciała wiedzieć linii poleceń
humanityANDpeace
25

Twój problem można rozwiązać na różne sposoby, w zależności od używanej wersji CUPS.

  1. Więcej najnowsze wersje CUPS (wersja 1.2 i wyżej) pochodzą z wbudowanym funkcjonalności, które mogą pomóc tutaj. Nazywa się to „ErrorPolicy”. Domyślne ustawienie jest wybrane w cupd.conf i określa, jak cupd powinien obsługiwać kolejki wydruku, które nie zachowują się zgodnie z oczekiwaniami. Masz 3 opcje do przypisania do każdej kolejki osobno:

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

    Wyjaśnienie:

    • abort-job
      - Przerwij to zadanie i przejdź do następnego zadania w tej samej kolejce

    • retry-job
      - Retry to praca po odczekaniu N sekund (gdzie N jest określana przez cupsd.conf „s«JobRetryInterval»dyrektywy).

    • retry-this-job
      - Ponów bieżącą pracę natychmiast i na czas nieokreślony.

    • stop-printer
      - Zatrzymaj bieżącą kolejkę drukowania i zachowaj zadanie do przyszłego drukowania. Jest to nadal domyślne, chyba że zdefiniujesz inaczej zgodnie z wyżej wymienionymi alternatywami. Było to również domyślne + możliwe zachowanie tylko dla wszystkich kolejek we wcześniejszych wersjach CUPS (tego, którego chcesz się pozbyć zgodnie z pytaniem).

    Ponadto można ustawić indywidualne ErrorPolicies dla każdej osobnej kolejki wydruku. To ustawienie zostanie odnotowane w pliku printers.conf. (Ustaw z wiersza poleceń za pomocą lpadmin -p printername -o printer-error-policy=retry-this-job).

  2. W przypadku starszych wersji CUPS polecam zajrzeć behdo CUPS BackEnd Handler . behto opakowanie, które można zastosować do dowolnego backendu CUPS.

    Zakładając, że twoja kolejka wydruku ma zdefiniowane zaplecze socket://192.168.1.111:9100i zachowuje się w sposób, który Ci się nie podoba (od czasu do czasu wyłączany przez cupd z powodu problemów z połączeniem sieciowym). Po behponownym zdefiniowaniu backendu w ten sposób:

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

    Spowodowałoby to ponowienie próby 20 razy w dwuminutowych odstępach i wyłączenie kolejki tylko wtedy, gdy nadal się nie powiedzie. Lub możesz to zrobić:

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

    Spowoduje to powtórzenie zadania 3 razy z 5-sekundowymi opóźnieniami między próbami. Jeśli zadanie nadal nie powiedzie się, zostanie odrzucone, ale kolejka nie zostanie wyłączona. Chcesz pozwolić cupd spróbować na czas nieokreślony połączyć się z urządzeniem? Dobrze, spróbuj tego:

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

    Spróbuj nieskończenie, aż drukarka wróci. Interwały między próbami połączenia wynoszą 30 sekund. Zadanie nie ginie po wyłączeniu drukarki. Możesz celowo opóźnić drukowanie, po prostu wyłączając drukarkę. Dobra konfiguracja dla drukarek stacjonarnych i / lub użytkowników domowych.


Ogólnie rzecz biorąc, nie ma potrzeby, żeby poeksperymentować z skryptach bash crona, lpadmin, cupsenablelub sudow celu ponownej aktywacji CUPS kolejki schodząc chaotycznie.

Kurt Pfeifle
źródło
Jak ustawić interwał ponawiania dla nowszych wersji CUPS?
Sepero,
@ Stepero: Tak. Na przykład: możesz spróbować JobRetryInterval 58spróbować co 58 sekund. Inne możliwe wartości to 1w(1 tydzień), 3d(3 dni), 7h(7 godzin) lub 4m(4 minuty).
Kurt Pfeifle
@ Sepero: Wszystkie możliwe cupsd.confparametry do CUPS v1.7 są udokumentowane tutaj: http://www.cups.org/documentation.php/doc-1.7/ref-cupsd-conf.html . Sprawdź adnotacje dla każdego parametru na prawej krawędzi strony: powie ci, która wersja CUPS jako pierwsza go obsługiwała. Miłego odkrywania bardziej przydatnych parametrów! :-)
Kurt Pfeifle,
8

-EOpcja drukarka stosować lpadminnależy zrobić. Prawdopodobnie możesz po prostu utworzyć zadanie cron za pomocą lpadminpolecenia.

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

cronWejście godzinowe :

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

Możesz to dodać, uruchamiając:

sudo crontab -e

Upewnij się, że dodajesz -Epo nazwie drukarki, ponieważ jest to opcja drukarki, a nie opcja lpadmin. Zwróć uwagę na następujący fragment man lpadminstrony wskazany w komentarzu poniżej:

Jeśli zostanie określona przed opcjami -d, -p lub -x, opcja -E wymusza szyfrowanie podczas łączenia się z serwerem.

Wstrzymano do odwołania.
źródło
2
To jest źle. -E w tym kontekście jest opcją drukarki i musi przejść PO nazwie drukarki, w przeciwnym razie włączasz szyfrowanie komunikacji. developer.apple.com/library/mac/documentation/Darwin/Reference/… - Określony przed opcjami -d, -p lub -x, opcja -E wymusza szyfrowanie podczas łączenia z serwerem.
scragar
To jedyne rozwiązanie, które działa dla mnie. kubki często bez przerwy zatrzymują drukarkę. error-policyNie wszystko naprawić. cupsenablenic nie naprawia. Tylko lpadmindla mnie.
λuser
6

Moja drukarka to HP CP1215 również miał błąd: Drukarka wstrzymana - „ Błąd / usr / lib / cups / backend / hp”

Po ponownym uruchomieniu obu cupsi avahi-daemoni identyfikacji drukarkę lpstat -pi umożliwienie ze cupsenablebyłem w stanie wydrukować ponownie. Tylko ponowne uruchomienie cupsi włączenie nie rozwiązało problemu.

Zmieniłem również domyślne zasady na ponawianie próby i ostatecznie uniknąłem błędów w przyszłości z cronjob:

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

gdzie poissa käytöstäjest fiński tekst lokalizacji do konserwacji „zepsuty” i HP_Tuloostinnazwa mojej drukarki.

Z mojego doświadczenia wynika, że ​​zarówno domyślne zasady, jak i bieżące zasady dotyczące drukarek powinny być skonfigurowane tak, aby były ponownym zadaniem. Domyślna zasada to tylko zasada, którą otrzymujesz podczas instalowania nowej drukarki.

Janne Raatikainen
źródło
2
ls /etc/cups/ppd/ |cut -d "." -f1 |grep -v VMware |xargs -i cupsenable {}

Zawiera listę wszystkich plików ppd, które reprezentują zainstalowaną drukarkę, odcina rozszerzenie ppd, ignoruje ppd VMware znajdujące się na wielu serwerach VMware (jeśli nie potrzebujesz tego po prostu usuń |grep -v VMware) i przekazuje inne nazwy, na xargsktóre wstrzymuje wszystkie drukarki.

Zadanie crona powinno sprawić, że będzie dobrze.

Dana M.
źródło
1

Jeśli problem polega na tym, że GUI wymaga zalogowania się, aby wznowić drukarkę, innym rozwiązaniem jest umożliwienie wznowienia drukarki za pomocą GUI bez logowania. Aby to zrobić, wyłącz kubki i edytuj ten wiersz 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>

I usuń Resume-Printerdyrektywę, a następnie ponownie uruchom kubki. Jeśli dyrektywa pojawia się w więcej niż jednej <Limit>sekcji, możesz ją usunąć z odpowiedniej <Policy>sekcji lub usunąć ze wszystkich. Powinieneś być teraz w stanie wznowić drukarkę bez logowania z GUI. Widziałem to na macworld, ale dotyczy to każdej instalacji kubków.

Pierz
źródło
1

Odpowiedź od Janne powyżej, np .:

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

... spowoduje, że CUPS będzie uruchamiany co minutę, bez względu na stan jakiejkolwiek drukarki. To dlatego, że klauzula restartu filiżanek nie jest sparowana z &&.

Oto krótki skrypt BASH, którego użyłem, aby uzależnić restart CUPS od wykrycia stanu awarii.

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

Zamień „DS40” na dowolną drukarkę, dla której szukasz statusu, a „wyłączone” na dowolne wyjście lpstat -p w twoim języku.

Xaphod
źródło
0

Zaktualizowałem cupdd.conf z linią:

ErrorPolicy abort-job

Następnie zrestartowałem cupd przy użyciu: /etc/init.d/cups restart

Ale kiedy patrzę na plik printers.conf, ErrorPolicy nie jest aktualizowany. Zgodnie z dokumentacją kubków w sekcji drukarki musi pojawić się wiersz „BłądPolicy przerwania zadania”.

Próbowałem też z lpadmin, aby zaktualizować ErrorPolicy. Nic nie zmienia ErrorPolicy lub nie przechodzi do pliku printers.conf.

czego mi brakuje? Jak upewnić się, że cupd faktycznie przerywa pracę po błędzie?


źródło
edycja printers.conf
KawaiKx
0

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

Źródło

vserg
źródło
5
Chcesz wyjaśnić, co to dokładnie robi? Dodaj trochę więcej kontekstu.
slhck
0

Kilka rozwiązań tutaj nie działało dla mnie (np. Sudo cupsenable i lpadmin -E).

Jeśli używasz Debiana 8.6, Cinnamon 2.2.16 (Linux), zrób to z menu startowego 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. 

W przypadku Ubuntu 16.04:

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

Spowoduje to otwarcie narzędzia do rozwiązywania problemów z drukowaniem. Powie ci, co robić dalej.

Prawdopodobnie będziesz musiał po prostu sprawdzić właściwość Włączone dla drukarki CUPS w Ustawieniach drukowania. (Najpierw musisz odblokować).

Na koniec, aby uniknąć tego powtórzenia, zmień „zasady” drukarek na „ponów zadanie” w konfiguracji drukarki wspomnianej powyżej (w obszarze właściwości | zasady).

Naprawiłem to dla mnie!

Co powoduje ten problem: jeśli moja drukarka Wi-Fi jest wyłączona podczas drukowania na DRUKARCE CUPS, a moją zasadą jest „zatrzymaj drukarkę”, to pojawia się komunikat, że nie mogłem wydrukować, a drukarka jest wyłączona (opcja Włączona nie jest zaznaczona) . Tylko jeśli zasada jest ustawiona na „ponów zadanie”, opcja Włączone nie będzie odznaczona. Kilka minut po ponownym uruchomieniu drukarki zadania zaczną się drukować.

(Mój drugi post na ten temat.)

Widok eliptyczny
źródło
0

Musiałem poradzić sobie z tymi samymi nonsensami CUPS tutaj ... Rozwiązaniem dla mnie był systemowy skrypt, który działa co n minut.

/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
źródło
-1

Jak już powiedzieli inni, „cupsenable” lub „lpadmin -E” powinny załatwić sprawę.

Powiązanym problemem jest IIRC, który domyślnie CUPS konfiguruje drukarkę tak, że jeśli drukowanie zadania się nie powiedzie, drukarka zostanie wyłączona. Możesz to zmienić, aby zamiast tego przerwać zadanie.

janneb
źródło
-1, ponieważ -E służy do szyfrowania.
Widok eliptyczny
Zobacz, jak poprawnie używać -E jako opcji drukarki, a nie jako opcji lpadmin, w innej odpowiedzi powyżej.
Widok eliptyczny