コマンドラインからCUPSプリンターを再開するには?


42

CUPSにプリンターがあり、ドライバーの問題(HP 1010)が原因で一時停止することがあります。

1時間に1回実行してCUPSでプリンターを再開するシェルスクリプトを作成したいと思います。しかし、シェルコマンドラインからプリンタを再開する方法を数分間グーグルで調べた後、私は全く知りません。


これの原因:1つは、wifiプリンターの電源を切ると、有効フラグがクリアされているようです。プリンタの電源を入れ直しても、有効フラグはチェックされた状態に戻りません。.. ---ジョブは印刷キューに蓄積されます。エラーメッセージは「フィルターに失敗しました」です。プリンター設定でこのボックスをチェックすると、プリンターは再び印刷を開始します。
エリプティカルビュー

回答:


66

cupsenableコマンドがあります。

cupsenable printer

無効なプリンターを起動します(プリンター名を確認するには、lpstat -pまたはでプリンターをリストできますlpc status)。

rootとして、またはsudoを介してコマンドを実行する必要がある場合があります。そのため、シェルスクリプトでプリンターを有効にする必要がある場合は、シェルをルートのcrontabに追加するか、sudoersファイルを編集する必要があります。


1
superuser.com/a/280400/160771のように」「肥大化したカップの設定を使用する」とは対照的に、この回答に+1を追加すると、本当に役立ちました。OPコマンドラインを知りたいと思っているので、ポイントにもそのより
humanityANDpeace

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"ディレクティブによって決定されます)。

    • retry-this-job
      -現在のジョブを即座に無期限に再試行します。

    • stop-printer
      -現在の印刷キューを停止し、将来の印刷のためにジョブを保持します。上記の代替案に従って別途定義しない限り、これはデフォルトのままです。また、CUPSの以前のバージョンのすべてのキューで可能な動作のみです(質問ごとに削除したいもの)。

    さらに、個別の印刷キューに個別のErrorPoliciesを設定できます。この設定は、printers.confファイルに記録されます。(コマンドラインからを使用して設定しますlpadmin -p printername -o printer-error-policy=retry-this-job)。

  2. CUPSの古いバージョンについてbehは、CUPS バックエンドハンドラーをご覧になることをお勧めします。behCUPSバックエンドに適用できるラッパーです。

    現在、印刷キューがのバックエンドを定義しておりsocket://192.168.1.111:9100、それが好ましくない方法で動作すると仮定します(ネットワーク接続の問題により時々cupsdによって無効にされます)。次のbehようにバックエンドを再定義します。

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

    これは、2分間隔でジョブを20回再試行し、まだ成功していない場合にのみキューを無効にします。または、これを行うことができます:

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

    これにより、試行間の5秒の遅延でジョブが3回再試行されます。それでもジョブが失敗する場合、ジョブは破棄されますが、キューは無効になりません。cupsdにデバイスへの接続を無期限に試行させたいですか?良い、これを試してください:

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

    プリンターが戻るまで無限に試してください。接続試行の間隔は30秒です。プリンターの電源をオフにしても、ジョブは失われません。プリンタのスイッチを切るだけで、意図的に印刷を遅らせることができます。デスクトッププリンターやホームユーザーに適した構成。


全体として、bashスクリプト、cronジョブなどをいじり回す必要はありませんlpadmincupsenableまたsudo、CUPSキューが不規則にダウンするのを再度アクティブにする必要もありません。


CUPSの最新バージョンの再試行間隔を設定するにはどうすればよいですか?
Sepero

@Sepero:はい。たとえばJobRetryInterval 58、58秒ごとに試すことができます。他の可能な値は、1w(1週間)、3d(3日間)、7h(7時間)または4m(4分)です。
カートPfeifle

@Sepero:CUPS v1.7までのすべての可能なcupsd.confパラメーターは、http://www.cups.org/documentation.php/doc-1.7/ref-cupsd-conf.htmlに文書化されています。ページの右端にある各パラメーターの注釈を確認してください。どのCUPSリリースが最初にそれをサポートしたかがわかります。より便利なパラメーターが発見されました!:
カートPfeifle

8

-E使用されるプリンタオプションlpadminはそれを行う必要があります。おそらく、lpadminコマンドでcronジョブを作成できます。

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 14

これが私にとって有効な唯一のソリューションです。cupsは、ほとんどの場合、理由もなくプリンターを一時停止し続けます。error-policy何も解決しません。cupsenable何も修正しません。lpadmin私だけのために。
λuser

6

私のプリンターはHP CP1215にもエラーがあります:プリンターの一時停止-「/ usr / lib / cups / backend / hp failed」

両方cupsを再起動し、でavahi-daemonプリンタを識別しlpstat -p、で有効にしたcupsenable後、再度印刷することができました。再起動cupsと有効化だけではうまくいきませんでした。

また、デフォルトポリシーをretry-jobに変更し、最終的にcronjobでエラーを回避することになりました。

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

どこpoissa käytöstä「注文のうち、」メンテナンスのためのフィンランド語のローカライズテキストであるとHP_Tuloostin私のプリンタの名前です。

私の経験では、default-policyと現在のプリンターポリシーの両方をretry-jobに設定する必要があります。デフォルトのポリシーは、新しいプリンターをインストールするときに取得するポリシーです。


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

これは、インストールされているプリンターを表すすべてのppdファイルをリストし、ppd拡張機能を切断し、多くのVMwareサーバーに含まれるVMware ppdを無視し(削除する必要がない場合|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ディレクティブを削除してから、cupsを再起動します。ディレクティブが複数の<Limit>セクションに表示される場合、関連する<Policy>セクションから削除するか、すべてから削除できます。これで、GUIからログインしなくてもプリンターを再開できるはずです。これはmacworldで見ましたが、どのカップのインストールにも当てはまります。


1

上記のJanneからの回答、例えばこれ:

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

...プリンタの状態に関係なく、CUPSが毎分再起動されます。これは、cups restart句が&&とペアになっていないためです。

これは、障害状態の検出時にCUPSの再起動を条件付きにするために使用した短いBASHスクリプトです。

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

次に、/etc/init.d/cups restartを使用してcupsdを再起動しました

しかし、printers.confファイルを見ると、ErrorPolicyは更新されていません。cupsのドキュメントによると、「ErrorPolicy abort-job」という行がプリンターセクションに表示される必要があります。

また、lpadminでErrorPolicyを更新しようとしました。ErrorPolicyは何も変更しないか、printers.confファイルに反映されません。

私は何が欠けていますか?cupsdがエラー時にジョブを実際に中止することを確認するにはどうすればよいですか?



0

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

ソース


5
これが何をするのかを正確に説明することに注意してください。もう少しコンテキストを追加してください。
-slhck

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プリンターのEnabledプロパティを確認する必要があります。(最初にロックを解除する必要があります)。

最後に、これが再び発生しないようにするには、上記のプリンターの設定で(プロパティ|ポリシーの下で)プリンターの「ポリシー」を「再試行ジョブ」に変更します。

私のためにそれを修正しました!

この問題の原因: CUPSプリンターに印刷するときにWiFiプリンターの電源が切れ、ポリシーが「プリンターの停止」である場合、印刷できず、プリンターが無効になっているというメッセージが表示されます(有効はオフ) 。ポリシーが「ジョブの再試行」に設定されている場合のみ、「有効」はオフになりません。プリンタの電源を入れ直してから数分後に、ジョブの印刷が開始されます。

(これに関する私の他の投稿。)


0

ここで同じCUPSナンセンスに対処しなければなりませんでした...私にとっての解決策は、n分ごとに実行されるsystemdスクリプトでした。

/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は暗号化用です。
楕円ビュー

上記の別の回答で、lpadminオプションとしてではなく、プリンタオプションとして-Eを適切に使用する方法を参照してください。
楕円ビュー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.