วิธีการเรียกคืนเครื่องพิมพ์ CUPS จากบรรทัดคำสั่ง?


42

ฉันมีเครื่องพิมพ์ใน CUPS ที่เกิดจากปัญหาไดรเวอร์ (HP 1010) เป็นครั้งคราวจะหยุดชั่วคราว

ฉันต้องการเขียนเชลล์สคริปต์ที่จะทำงานหนึ่งครั้งต่อชั่วโมงเพื่อให้เครื่องพิมพ์กลับมาทำงานใน CUPS แต่ฉันไม่มีความคิดหลังจาก googling สองสามนาทีวิธีการดำเนินการต่อเครื่องพิมพ์จากบรรทัดคำสั่งเชลล์


อะไรคือสาเหตุของสิ่งนี้: อย่างใดอย่างหนึ่งเมื่อเครื่องพิมพ์ไร้สายของฉันถูกปิดดูเหมือนว่าจะล้างธงที่เปิดใช้งาน แม้ว่าจะเปิดเครื่องพิมพ์สำรองการตั้งค่าสถานะที่เปิดใช้งานจะไม่ถูกเรียกคืนไปยังการตรวจสอบ .. --- งานจะซ้อนในคิวการพิมพ์ ข้อความแสดงข้อผิดพลาดคือ "ตัวกรองล้มเหลว" เมื่อฉันทำเครื่องหมายที่ช่องนี้ในการตั้งค่าเครื่องพิมพ์เครื่องพิมพ์จะเริ่มพิมพ์อีกครั้ง
มุมมองรูปไข่

คำตอบ:


66

มีคำสั่ง cupsenable

cupsenable printer

เริ่มต้นเครื่องพิมพ์ที่ปิดใช้งาน (เพื่อค้นหาชื่อพรินเตอร์ที่คุณสามารถแสดงรายการเครื่องพิมพ์ด้วยlpstat -pหรือlpc status)

คุณอาจต้องเรียกใช้คำสั่งเป็นรูตหรือผ่าน sudo ดังนั้นหากคุณต้องเปิดใช้งานเครื่องพิมพ์ในเชลล์สคริปต์คุณจะต้องเพิ่มเชลล์ลงใน crontab ของรูทหรือแก้ไขไฟล์ sudoers ของคุณ


1
+1 คำตอบนี้ตรงกันข้ามกับ "ใช้การกำหนดค่าถ้วยที่ซ้อนทับ" (เช่นเดียวกับในsuperuser.com/a/280400/160771 ) ช่วยได้จริงๆ นอกจากนี้ยังมีประเด็นอีกมากเนื่องจาก OP ต้องการทราบบรรทัดคำสั่ง
มนุษยชาติและ

25

ปัญหาของคุณอาจถูกแก้ไขได้หลายวิธีขึ้นอยู่กับรุ่นของ CUPS ที่คุณใช้งาน

  1. เพิ่มเติมรุ่นล่าสุดของ CUPS (รุ่น 1.2 ขึ้นไป) มาพร้อมกับฟังก์ชั่นในตัวที่จะช่วยให้ที่นี่ มันเรียกว่า "ErrorPolicy" เป็นการตั้งค่าเริ่มต้นถูกเลือกใน cupsd.conf และกำหนดวิธีที่ cupsd ควรจัดการกับคิวการพิมพ์ที่ไม่ทำงานตามที่คาดไว้ คุณมี 3 ตัวเลือกในการแท็กแต่ละคิว:

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

    คำอธิบาย:

    • abort-job
      - ยกเลิกงานนี้และทำงานต่อไปในคิวเดียวกัน

    • retry-job
      - ลองอีกครั้งงานนี้หลังจากที่รอคอยวินาที N (ที่ N จะถูกกำหนดโดยcupsd.confของ 'JobRetryInterval directive')

    • retry-this-job
      - ลองงานปัจจุบันทันทีและไม่ จำกัด ระยะ

    • stop-printer
      - หยุดคิวการพิมพ์ปัจจุบันและเก็บงานไว้สำหรับการพิมพ์ในอนาคต สิ่งนี้ยังคงเป็นค่าเริ่มต้นเว้นแต่คุณจะกำหนดเป็นอย่างอื่นตามทางเลือกที่กล่าวไว้ข้างต้นนอกจากนี้ยังเป็นค่าเริ่มต้น + เฉพาะพฤติกรรมที่เป็นไปได้สำหรับคิวทั้งหมดใน CUPS รุ่นก่อนหน้า (สิ่งที่คุณต้องการกำจัดตามคำถามของคุณ)

    นอกจากนี้คุณสามารถตั้งค่า ErrorPolicies แต่ละรายการเป็นคิวการพิมพ์แยกกัน การตั้งค่านี้จะถูกบันทึกไว้ในไฟล์ printers.conf (ตั้งจาก commandline ด้วยlpadmin -p printername -o printer-error-policy=retry-this-job)

  2. สำหรับรุ่นเก่าของ CUPSผมอยากแนะนำให้มีลักษณะที่beh, ถ้วยแบ็กเอนด์ Handler behเป็น wrapper ซึ่งสามารถนำไปใช้กับแบ็กเอนด์ CUPS ใด ๆ

    สมมติว่าคิวงานพิมพ์ของคุณได้กำหนดแบ็คเอนด์socket://192.168.1.111:9100แล้วและมันจะทำงานในแบบที่คุณไม่ชอบ (ถูกปิดการใช้งานโดย cupsd เป็นครั้งคราวเนื่องจากปัญหาการเชื่อมต่อเครือข่าย) ด้วยbehคุณจะต้องกำหนดแบ็กเอนด์ของคุณเช่นนี้อีกครั้ง:

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

    สิ่งนี้จะลองงาน 20 ครั้งในช่วงเวลาสองนาทีและปิดใช้งานคิวเฉพาะเมื่อยังไม่ประสบความสำเร็จ หรือคุณสามารถทำสิ่งนี้:

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

    สิ่งนี้จะลองใช้งาน 3 ครั้งโดยมีความล่าช้า 5 วินาทีระหว่างความพยายาม หากงานยังคงล้มเหลวจะถูกยกเลิก แต่คิวจะไม่ถูกปิดใช้งาน คุณต้องการให้ cupsd ลองเชื่อมต่อกับอุปกรณ์อย่างไม่มีกำหนดหรือไม่? ดีลองทำสิ่งนี้:

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

    ลองไม่ จำกัด จนกว่าเครื่องพิมพ์จะกลับมา ช่วงเวลาระหว่างความพยายามในการเชื่อมต่อคือ 30 วินาที งานจะไม่สูญหายเมื่อปิดเครื่องพิมพ์ คุณสามารถชะลอการพิมพ์อย่างจงใจโดยการปิดเครื่องพิมพ์ การกำหนดค่าที่ดีสำหรับเครื่องพิมพ์เดสก์ทอปและ / หรือผู้ใช้ตามบ้าน


โดยรวมมีความจำเป็นที่จะยุ่ง ๆ กับสคริปต์ทุบตีงาน cron ไม่lpadmin, cupsenableหรือsudoเพื่อ CUPS เปิดใช้งานคิวจะลงผิดปกติ


เราจะกำหนดช่วงเวลาการลองส่งใหม่สำหรับ CUPS รุ่นล่าสุดได้อย่างไร
Sepero

@Sepero: ใช่ ตัวอย่างเช่นคุณสามารถJobRetryInterval 58ลองทุก ๆ 58 วินาที ค่าที่เป็นไปได้อื่น ๆ คือ1w(1 สัปดาห์), 3d(3 วัน), 7h(7 ชั่วโมง) หรือ4m(4 นาที)
Kurt Pfeifle

@Sepero: ทั้งหมดที่เป็นไปได้cupsd.confพารามิเตอร์ถึง CUPS v1.7 มีเอกสารที่นี่: http://www.cups.org/documentation.php/doc-1.7/ref-cupsd-conf.html ตรวจสอบคำอธิบายประกอบสำหรับแต่ละพารามิเตอร์ที่ขอบด้านขวาของหน้า: มันจะบอกคุณว่าการเปิดตัว CUPS เป็นคนแรกที่ให้การสนับสนุน การค้นพบที่มีความสุขของ params ที่มีประโยชน์มากขึ้น! :-)
Kurt Pfeifle

8

-Eตัวเลือกเครื่องพิมพ์ใช้กับlpadminควรทำอย่างนั้น คุณสามารถสร้างงาน cron ด้วยlpadminคำสั่ง

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

cronรายการรายชั่วโมง:

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

คุณสามารถเพิ่มได้โดยการเรียกใช้:

sudo crontab -e

ตรวจสอบให้แน่ใจว่าคุณเพิ่ม-Eชื่อเครื่องพิมพ์ไว้ด้านหลังเนื่องจากเป็นตัวเลือกเครื่องพิมพ์ที่นี่ไม่ใช่ตัวเลือก lpadmin ข้อความที่ตัดตอนมาต่อไปนี้จากman lpadminหน้าซึ่งถูกชี้ให้เห็นในความคิดเห็นด้านล่าง:

เมื่อระบุไว้ก่อนหน้าตัวเลือก -d, -p หรือ -x ตัวเลือก -E จะบังคับใช้การเข้ารหัสเมื่อเชื่อมต่อกับเซิร์ฟเวอร์


2
นี่เป็นสิ่งที่ผิด - E ในบริบทนี้เป็นตัวเลือกเครื่องพิมพ์และต้องไปหลังจากชื่อเครื่องพิมพ์มิฉะนั้นคุณเพียงแค่เปิดการเข้ารหัสการสื่อสาร developer.apple.com/library/mac/documentation/Darwin/Reference/ ...... - เมื่อระบุไว้ก่อนหน้าตัวเลือก -d, -p หรือ -x ตัวเลือก -E จะบังคับใช้การเข้ารหัสเมื่อเชื่อมต่อกับเซิร์ฟเวอร์
scragar

นี่เป็นทางออกเดียวที่เหมาะกับฉัน ถ้วยทำให้เครื่องพิมพ์หยุดชั่วคราวโดยไม่มีเหตุผล error-policyไม่สามารถแก้ไขอะไร cupsenableไม่ได้แก้ไขอะไรเลย เพียง แต่lpadminไม่สำหรับผม
λuser

6

เครื่องพิมพ์ของฉันคือ HP CP1215 ก็มีข้อผิดพลาด: เครื่องพิมพ์หยุดชั่วคราว - "/ usr / lib / cups / backend / hp ล้มเหลว"

หลังจากรีสตาร์ททั้งcupsและavahi-daemonและระบุเครื่องพิมพ์ด้วยlpstat -pและเปิดใช้งานด้วยcupsenableฉันก็สามารถพิมพ์ได้อีกครั้ง รีสตาร์ทเท่านั้นcupsและการเปิดใช้งานไม่ได้ทำเคล็ดลับ

ฉันยังเปลี่ยนนโยบายเริ่มต้นเป็นลองใหม่อีกครั้งและในที่สุดก็หลีกเลี่ยงข้อผิดพลาดในอนาคตด้วย cronjob:

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

ที่poissa käytöstäมีข้อความการแปลภาษาฟินแลนด์สำหรับการบำรุงรักษา "ไม่เรียบร้อย" และHP_Tuloostinเป็นชื่อเครื่องพิมพ์ของฉัน

จากประสบการณ์ของฉันทั้งนโยบายเริ่มต้นและนโยบายเครื่องพิมพ์ปัจจุบันควรได้รับการกำหนดค่าให้ลองใหม่ นโยบายเริ่มต้นเป็นเพียงนโยบายที่คุณได้รับเมื่อคุณติดตั้งเครื่องพิมพ์ใหม่


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

รายการนี้แสดงไฟล์ ppd ทั้งหมดซึ่งเป็นตัวแทนของเครื่องพิมพ์ที่ติดตั้งตัดส่วนขยาย ppd ออกละเว้น VMware ppd ที่รวมอยู่ในเซิร์ฟเวอร์ VMware จำนวนมาก (หากคุณไม่ต้องการเพียงแค่ลบออก|grep -v VMware) และส่งผ่านชื่ออื่น ๆxargsที่ไม่ได้หยุดการทำงานชั่วคราวทั้งหมด เครื่องพิมพ์

งาน cron ควรทำให้มันทำงานได้ดี


1

หากปัญหายังคงอยู่กับความจริงที่ว่า GUI ต้องการการเข้าสู่ระบบเพื่อเริ่มต้นเครื่องพิมพ์ใหม่อีกวิธีหนึ่งคือการอนุญาตให้เครื่องพิมพ์กลับมาทำงานผ่าน GUI ได้โดยไม่ต้องเข้าสู่ระบบ ในการทำเช่นนั้นให้ปิดคัพและแก้ไขบรรทัดนี้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>

และลบResume-Printerคำสั่งแล้วรีสตาร์ทถ้วย หากคำสั่งปรากฏขึ้นมากกว่าหนึ่ง<Limit>ส่วนคุณสามารถลบมันออกจาก<Policy>ส่วนที่เกี่ยวข้องหรือลบออกจากทั้งหมด ตอนนี้คุณควรจะสามารถดำเนินการต่อเครื่องพิมพ์โดยไม่ต้องเข้าสู่ระบบจาก GUI ฉันเห็นสิ่งนี้บนmacworldแต่มันใช้ได้กับทุกถ้วยติดตั้ง


1

คำตอบจาก Janne ด้านบนเช่นนี้

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

... จะทำให้ CUPS เริ่มต้นใหม่ทุกนาทีโดยไม่คำนึงว่าเครื่องพิมพ์อยู่ในสถานะใดนั่นเป็นเพราะข้อเริ่มต้นของถ้วยใหม่ไม่ได้จับคู่กับ &&

นี่เป็นสคริปต์ BASH สั้น ๆ ที่ฉันใช้เพื่อเริ่มการทำงาน CUPS ตามเงื่อนไขเมื่อตรวจพบสถานะความล้มเหลว

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

แทนที่ "DS40" ด้วยเครื่องพิมพ์อะไรก็ตามที่คุณกำลังมองหาสถานะและ "ปิดการใช้งาน" ด้วยเอาต์พุต lpstat -p ใด ๆ ในภาษาของคุณ


0

ฉันอัพเดท cupsd.conf ด้วยบรรทัด:

ErrorPolicy ยกเลิกงาน

จากนั้นฉันรีสตาร์ท cupsd โดยใช้: /etc/init.d/cups รีสตาร์ท

แต่เมื่อฉันดูที่ไฟล์ printers.conf ErrorPolicy จะไม่ได้รับการอัพเดต ตามเอกสารของถ้วยบรรทัด "ErrorPolicy abort-job" จะต้องปรากฏในส่วนเครื่องพิมพ์

ฉันยังลองกับ lpadmin เพื่ออัพเดต ErrorPolicy ไม่มีอะไรเปลี่ยนแปลง ErrorPolicy หรือไม่ได้ทำให้เป็นไฟล์ printers.conf

ฉันพลาดอะไรไป ฉันจะแน่ใจได้อย่างไรว่า cupsd ยกเลิกงานผิดพลาดจริง ๆ ?


แก้ไข printers.conf
KawaiKx


0

การแก้ปัญหาหลายอย่างที่นี่ไม่ได้ผลสำหรับฉัน (เช่น sudo cupsenable และ lpadmin -E)

หากคุณใช้Debian 8.6, Cinnamon 2.2.16 (Linux) ให้ทำสิ่งนี้จากเมนูเริ่ม 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. 

สำหรับUbuntu 16.04:

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

นี่เป็นการเปิดตัวแก้ไขปัญหาการพิมพ์ มันจะบอกคุณว่าต้องทำอย่างไรต่อไป

อาจเป็นเพียงคุณจะต้องตรวจสอบคุณสมบัติที่เปิดใช้งานสำหรับเครื่องพิมพ์ CUPS ของคุณในการตั้งค่าการพิมพ์ของคุณ (คุณจะต้องปลดล็อคก่อน)

สุดท้ายเพื่อหลีกเลี่ยงสิ่งนี้ให้เกิดขึ้นอีกให้เปลี่ยนเครื่องพิมพ์ "นโยบาย" เป็น "ลองใหม่" ในการตั้งค่าเครื่องพิมพ์ที่กล่าวถึงข้างต้น (ภายใต้คุณสมบัติ | นโยบาย)

แก้ไขให้ฉัน!

สิ่งที่ทำให้เกิดปัญหานี้:หากเครื่องพิมพ์ไร้สายของฉันถูกปิดลงเมื่อฉันพิมพ์ไปที่เครื่องพิมพ์ CUPS และนโยบายของฉันคือ "หยุดเครื่องพิมพ์" จากนั้นฉันได้รับข้อความว่าฉันไม่สามารถพิมพ์ได้และเครื่องพิมพ์ถูกปิดใช้งาน . เฉพาะในกรณีที่นโยบายถูกตั้งค่าเป็น "ลองงานใหม่" จะไม่เปิดใช้งานจะไม่ถูกตรวจสอบ ไม่กี่นาทีหลังจากที่เครื่องพิมพ์เปิดเครื่องสำรองงานของคุณจะเริ่มพิมพ์

( โพสต์อื่น ๆของฉันเกี่ยวกับเรื่องนี้)


0

ต้องจัดการกับเรื่องไร้สาระ CUPS เดียวกันที่นี่ ... ทางออกสำหรับฉันคือสคริปต์ systemd ที่ทำงานทุก ๆ n นาที

/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

อย่างที่คนอื่นพูดไปแล้วว่า 'cupsenable' หรือ 'lpadmin -E' ควรทำแบบนี้

ปัญหาที่เกี่ยวข้องคือ IIRC โดยค่าเริ่มต้น CUPS กำหนดค่าเครื่องพิมพ์เช่นนั้นหากการพิมพ์งานล้มเหลวอย่างใดเครื่องพิมพ์จะถูกปิดใช้งาน คุณสามารถเปลี่ยนสิ่งนี้เพื่อยกเลิกงานแทน


-1 เนื่องจาก -E ใช้สำหรับการเข้ารหัส
มุมมองรูปไข่

ดูวิธีการใช้ -E เป็นตัวเลือกเครื่องพิมพ์อย่างถูกต้องไม่ใช่ตัวเลือก lpadmin ในคำตอบอื่นด้านบน
มุมมองรูปไข่
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.