web-dev-qa-db-ja.com

CUPSでプリンターがオン/オフラインになっていることを確認する方法は?

ネットワーク上にいくつかのウィンドウボックスがあり、それらに共有プリンターがあります。

私はCUPS Webインターフェイスを介してそれらを追加しました。それらはすべて魅力のように機能し、phpでそれらに印刷できます。

exec('lp -d vasosamsung file.pdf');

涼しい。私はPrinterクラスをワーティングしています。これは、印刷ジョブが開始する前に検証を行うものです。

私がチェックする最初のことはプリンタが存在することです:

lpstat -p vasosamsung

表示されていない場合は、宛先が無効です。はい、次に進みます。そして、ここでトリッキーな部分があります。

答えがアイドル状態、または印刷である場合、すべてが問題ないので、ジョブを送信しましょう。

しかし!

問題は、私のマシンではプリンターがプリンターのリストに追加されているため、プリンターがアイドル状態になっているということですが、残念ながらオフラインです。これは私がキャッチしたいものです。さらに問題が発生します。

プリンター自体がオフライン(マシンから引き出されている)であっても、ジョブはキューにあります。

本当の問題は、右クリックして「プリンターとデバイス」からプリンター全体を削除すると、CUPSはアイドル状態になると言っています。 service cups restartでCUPSを再起動し、統計を取得しました。

printer vasosamsung is idle.  enabled since Thu 06 Apr 2017 03:34:26 PM CEST

それは本当ではない。今私のマシンにはこのようなプリンターがあります。最悪の場合、私がそれにドキュメントを送信すると、次のようになります。

string(40) "request id is vasosamsung-71 (1 file(s))"

そして仕事はウェブインターフェース上にあります:

vasosamsung-71  Unknown     Withheld    1933k   1   held since

2017年4月6日(木)15:59:43

私の質問は、物理プリンタのステータスを取得する方法はありますか?オフライン、印刷など... CUPSからではありませんか?

それが不可能な場合、どういうわけか私は得ることができます、プリンタは少なくともターゲットマシンのデバイスリストにありますか?

[〜#〜]編集[〜#〜]

へへ、私がマシンをオフにすると、プリンターもアイドル状態になります:)

これは、vasosamsungプリンターがCUPSにあり、それがフィスカルデバイスではないためだと思いますが、今はわかりますが、私の質問はまだ生きています。

1
vaso123

lpstat-tパラメータと共に使用します。

$ lpstat -t
scheduler is running
system default destination: DCP-7065DN
device for DCP-7065DN: usb://Brother/DCP-7065DN?serial=<REDACTED>
DCP-7065DN accepting requests since Tue 19 Nov 2019 04:29:56 PM MST
printer DCP-7065DN is idle.  enabled since Tue 19 Nov 2019 04:29:56 PM MST

システムは、プリンターが要求を受け入れていることを知らせます(「Good to go」など)。

1

私の解決策:Cで記述されたプログラムに関数(または1964年の私の最初の言語であるALGOLのプロシージャ)を含めます...

#define BUFFERLEN 1024
int isprtready( void )
{ char cmd[BUFFERLEN], buffer[BUFFERLEN], usbstat[]="lsusb > ",
       enabled[]="Hewlett-Packard LaserJet 2420", filename[]="prtreadyXXXXXX";
  int handle, len;

  handle = mkstemp( filename );

  strcpy( cmd, usbstat );
  strcat( cmd, filename );
  system( cmd );
  len = read( handle, buffer, BUFFERLEN );
  buffer[len] = '\0';
  close( handle ); 
  unlink( filename );

  return ( strstr( buffer, enabled ) != (char*)NULL );
}

必要なものが含まれています
欠点:明示的なプリンター名がプログラムに含まれています。 (私は1台のコンピューターと1台のプリンターしかなく、ネットワークなどはありません。)

0
Hans R. Vollmer