Bagaimana cara melanjutkan printer CUPS dari baris perintah?

42

Saya memiliki printer di CUPS yang karena masalah driver (HP 1010) dari waktu ke waktu berhenti sementara.

Saya ingin menulis skrip shell yang akan dijalankan sekali per jam untuk melanjutkan printer di CUPS. Tapi saya tidak tahu setelah googling selama beberapa menit bagaimana melanjutkan printer dari baris perintah shell.

Stani
sumber
Apa yang menyebabkan ini: Pertama, ketika printer wifi saya dimatikan sepertinya menghapus bendera Diaktifkan. Bahkan ketika printer dinyalakan kembali, bendera yang Diaktifkan tidak dikembalikan untuk diperiksa. .. --- Pekerjaan kemudian akan menumpuk di antrian cetak. Pesan kesalahan adalah "filter gagal". Ketika saya mencentang kotak ini di pengaturan printer, printer mulai mencetak lagi.
Pemandangan elips

Jawaban:

66

Ada perintah cupsenable.

cupsenable printer

memulai pencetak yang dinonaktifkan (untuk mengetahui nama pencetak Anda dapat mencantumkan pencetak Anda dengan lpstat -patau lpc status).

Anda mungkin harus menjalankan perintah sebagai root atau melalui sudo. Jadi, jika Anda harus mengaktifkan printer dalam skrip shell, Anda harus menambahkan shell ke crontab root, atau mengedit file sudoers Anda.

David V.
sumber
1
Memberi +1 jawaban ini berbeda dengan "gunakan konfigurasi cangkir berlebih" (seperti pada superuser.com/a/280400/160771 ), sangat membantu. Juga lebih pada intinya, karena OP ingin tahu baris perintah
humanityANDpeace
25

Masalah Anda dapat diatasi dengan berbagai cara, tergantung pada versi CUPS yang Anda jalankan.

  1. Lebih versi terbaru dari CUPS (versi 1.2 dan di atas) datang dengan fungsi builtin yang bisa membantu di sini. Ini disebut "ErrorPolicy". Pengaturan standarnya dipilih di cupsd.conf, dan menentukan bagaimana cupsd harus menangani antrian cetak yang tidak berperilaku seperti yang diharapkan. Anda memiliki 3 pilihan untuk menandai masing-masing antrian:

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

    Penjelasan:

    • abort-job
      - Batalkan pekerjaan ini dan lanjutkan dengan pekerjaan berikutnya dalam antrian yang sama

    • retry-job
      - Coba lagi pekerjaan ini setelah menunggu selama N detik (di mana N ditentukan oleh direktif cupsd.conf "JobRetryInterval").

    • retry-this-job
      - Coba lagi pekerjaan saat ini segera dan tanpa batas.

    • stop-printer
      - Hentikan antrian cetak saat ini dan simpan pekerjaan itu untuk pencetakan di masa mendatang. Ini masih default, kecuali jika Anda menentukan sebaliknya sesuai alternatif yang disebutkan di atas. Ini juga + default hanya perilaku yang mungkin untuk semua antrian dalam versi CUPS sebelumnya (yang Anda ingin singkirkan sesuai pertanyaan Anda).

    Selain itu, Anda dapat mengatur masing-masing ErrorPolicies ke setiap antrian cetak yang terpisah. Pengaturan ini akan dicatat dalam file printers.conf. (Atur dari baris perintah dengan lpadmin -p printername -o printer-error-policy=retry-this-job).

  2. Untuk versi CUPS yang lebih lama, saya sarankan untuk melihatnya beh, CUPS BackEnd Handler . behadalah pembungkus yang dapat diterapkan ke backend CUPS.

    Dengan asumsi antrian cetak Anda saat ini telah menetapkan backend of socket://192.168.1.111:9100, dan itu berperilaku dengan cara yang tidak Anda sukai (dinonaktifkan oleh cupsd dari waktu ke waktu karena masalah koneksi jaringan). Dengan behAnda akan mendefinisikan kembali backend Anda seperti ini:

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

    Ini akan mencoba lagi pekerjaan 20 kali dalam interval dua menit , dan menonaktifkan antrian hanya ketika masih tidak berhasil. Atau Anda bisa melakukan ini:

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

    Ini ulangi pekerjaan 3 kali dengan penundaan 5 detik antara upaya. Jika pekerjaan masih gagal, itu dibuang, tetapi antrian tidak dinonaktifkan. Anda ingin membiarkan cupsd mencoba tanpa batas untuk terhubung ke perangkat? Bagus, coba ini:

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

    Coba tanpa batas hingga printer kembali. Interval antara upaya koneksi adalah 30 detik. Pekerjaan tidak hilang saat printer dimatikan. Anda dapat dengan sengaja menunda pencetakan hanya dengan mematikan printer. Konfigurasi yang baik untuk printer desktop dan / atau pengguna rumahan.


Secara keseluruhan, tidak perlu dipusingkan dengan skrip bash, tugas cron lpadmin,, cupsenableatau sudountuk mengaktifkan kembali antrian CUPS yang turun secara tidak menentu.

Kurt Pfeifle
sumber
Bagaimana kita dapat mengatur interval coba lagi untuk versi CUPS yang lebih baru?
Sepero
@Sepero: Ya. Misalnya: Anda dapat JobRetryInterval 58mencoba setiap 58 detik. Nilai lain yang mungkin adalah 1w(1 minggu), 3d(3 hari), 7h(7 jam) atau 4m(4 menit).
Kurt Pfeifle
@Sepero: Semuacupsd.conf parameter yang memungkinkan hingga CUPS v1.7 didokumentasikan di sini: http://www.cups.org/documentation.php/doc-1.7/ref-cupsd-conf.html . Periksa anotasi untuk setiap parameter di tepi kanan halaman: ini akan memberi tahu Anda rilis CUPS mana yang pertama mendukungnya. Selamat menemukan params yang lebih berguna! :-)
Kurt Pfeifle
8

The -Eopsi printer yang digunakan dengan lpadminharus melakukan itu. Anda mungkin bisa membuat pekerjaan cron dengan lpadminperintah.

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

cronEntri setiap jam :

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

Anda dapat menambahkannya dengan menjalankan:

sudo crontab -e

Pastikan Anda menambahkan -Esetelah nama printer, karena ini adalah opsi printer di sini, bukan opsi lpadmin. Perhatikan kutipan berikut dari man lpadminhalaman yang ditunjukkan dalam komentar di bawah ini:

Ketika ditentukan sebelum opsi -d, -p, atau -x, opsi -E memaksa enkripsi saat menghubungkan ke server.

Dijeda sampai pemberitahuan lebih lanjut.
sumber
2
Ini salah. -E dalam konteks ini adalah opsi printer, dan harus SETELAH nama printer, jika tidak Anda hanya menghidupkan enkripsi komunikasi. developer.apple.com/library/mac/documentation/Darwin/Reference/… - Ketika ditentukan sebelum opsi -d, -p, atau -x, opsi -E memaksa enkripsi saat menyambung ke server.
scragar
Ini adalah satu-satunya solusi yang berfungsi untuk saya. gelas terus menjeda printer tanpa alasan yang cukup sering. Tidak error-policymemperbaiki apa pun. cupsenabletidak memperbaiki apa pun. Hanya lpadminuntuk saya.
λuser
6

Printer saya HP CP1215 juga memiliki kesalahan: Printer Dijeda - "/ usr / lib / cups / backend / hp gagal"

Setelah me-restart keduanya cupsdan avahi-daemonmengidentifikasi printer dengan lpstat -pdan mengaktifkan cupsenable, saya dapat mencetak lagi. Restart saja cupsdan mengaktifkan tidak berhasil.

Saya juga mengubah kebijakan default untuk mencoba ulang pekerjaan dan akhirnya menghindari kesalahan di masa depan dengan cronjob:

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

di mana poissa käytöstäteks lokalisasi Finlandia untuk pemeliharaan "rusak" dan HP_Tuloostinmerupakan nama printer saya.

Dalam pengalaman saya, kebijakan default dan kebijakan printer saat ini harus dikonfigurasi untuk mencoba kembali pekerjaan. Kebijakan default adalah kebijakan yang Anda dapatkan saat memasang printer baru.

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

Ini mencantumkan semua file ppd yang mewakili printer yang diinstal, memotong ekstensi ppd, mengabaikan ppd VMware yang disertakan pada banyak server VMware (jika Anda tidak perlu menghapusnya begitu saja |grep -v VMware), dan meneruskan nama-nama lain xargsyang tidak terhapuskan semua printer.

Pekerjaan cron harus membuat ini berfungsi dengan baik.

Dana M
sumber
1

Jika masalahnya adalah fakta bahwa GUI memerlukan login untuk melanjutkan printer, maka solusi lain adalah mengizinkan printer melanjutkan melalui GUI tanpa login. Untuk melakukannya, matikan cangkir dan edit baris ini 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>

Dan hapus Resume-Printerarahan, lalu restart gelas. Jika arahan muncul di lebih dari satu <Limit>bagian maka Anda dapat menghapusnya dari bagian yang relevan <Policy>atau menghapus dari semua. Anda sekarang dapat melanjutkan printer tanpa login dari GUI. Saya melihat ini di macworld tetapi ini berlaku untuk semua piala yang dipasang.

Pierz
sumber
1

Jawaban dari Janne di atas, misalnya ini:

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

... akan menyebabkan CUPS dihidupkan ulang setiap menit, terlepas dari kondisi apa pun yang digunakan printer. Karena klausa restart cangkir tidak dipasangkan dengan &&.

Berikut ini adalah skrip BASH singkat yang saya gunakan untuk membuat restart CUPS bersyarat setelah mendeteksi keadaan kegagalan.

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

Ganti "DS40" dengan printer apa pun yang Anda cari statusnya, dan "nonaktifkan" dengan apa pun keluaran lpstat -p dalam bahasa Anda.

xaphod
sumber
0

Saya memperbarui cupsd.conf dengan baris:

ErrorPolicy batalkan pekerjaan

Kemudian saya memulai kembali cupsd menggunakan: /etc/init.d/cups restart

Tetapi ketika saya melihat file printers.conf, ErrorPolicy tidak diperbarui. Menurut dokumentasi cangkir, baris "Pekerjaan aborsi ErrorPolicy" harus muncul di bagian printer.

Saya juga mencoba dengan lpadmin untuk memperbarui ErrorPolicy. Tidak ada yang mengubah ErrorPolicy atau tidak membuatnya menjadi file printers.conf.

Apa yang saya lewatkan? Bagaimana cara memastikan bahwa cupsd benar-benar membatalkan pekerjaan karena kesalahan?


sumber
edit printers.conf
KawaiKx
0

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

Sumber

vserg
sumber
5
Mau jelaskan untuk apa ini, tepatnya? Harap tambahkan sedikit lebih banyak konteks.
slhck
0

Banyak solusi di sini tidak bekerja untuk saya, (misalnya sudo cupsenable dan lpadmin -E).

Jika Anda menggunakan Debian 8.6, Cinnamon 2.2.16 (Linux) lakukan ini dari menu mulai GUI Anda:

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. 

Untuk Ubuntu 16.04:

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

Ini membuka pemecah masalah pencetakan. Ini akan memberi tahu Anda apa yang harus dilakukan selanjutnya.

Mungkin Anda hanya perlu memeriksa properti Diaktifkan untuk printer CUPS Anda di Pengaturan Cetak Anda. (Anda harus membuka kunci terlebih dahulu).

Akhirnya, untuk menghindari hal ini terjadi lagi, ubah "kebijakan" printer ke "coba kembali" dalam pengaturan printer yang disebutkan di atas (di bawah properties | kebijakan).

Perbaiki untuk saya!

Apa yang menyebabkan masalah ini: Jika printer wifi saya dimatikan ketika saya mencetak ke CUPS PRINTER, dan kebijakan saya adalah "stop printer", maka saya mendapatkan pesan bahwa saya tidak bisa mencetak dan printer dinonaktifkan (Diaktifkan tidak dicentang) . Hanya jika kebijakan diatur ke "coba lagi pekerjaan" yang Diaktifkan tidak akan dicentang. Beberapa menit setelah printer dihidupkan kembali, pekerjaan Anda akan mulai dicetak.

( Posting saya yang lain tentang ini.)

Pandangan elips
sumber
0

Harus berurusan dengan omong kosong CUPS yang sama di sini ... Solusi bagi saya adalah skrip systemd yang berjalan setiap n menit.

/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
sumber
-1

Seperti yang telah dikatakan orang lain, 'cupsenable' atau 'lpadmin -E' harus melakukan trik.

Masalah terkait adalah IIRC yang secara default CUPS mengkonfigurasi printer sedemikian rupa sehingga jika suatu pekerjaan gagal, printer dinonaktifkan. Anda dapat mengubah ini untuk membatalkan pekerjaan.

janneb
sumber
-1 as -E adalah untuk enkripsi.
Tampilan elips
Lihat cara menggunakan -E sebagai opsi printer dengan benar, bukan sebagai opsi lpadmin, dalam jawaban lain di atas.
Tampilan elips