CUPS印刷ジョブのタイムスタンプの表示

CUPS印刷ジョブのタイムスタンプの表示

CUPSでジョブのタイムスタンプを表示する方法を探しています。マニュアルページを検索しましたが見つかりません。

長期的な目標は、サーバーの過負荷を防ぐためにjobIDの時間を解析し、特定の年齢よりも古いジョブを自動的に削除できるスクリプトを持つことです。私のCUPSサーバーには2000を超える印刷キューがあります。

答え1

私はU&Lウェブサイトでこれを達成するための可能な方法についてのヒントを提供する2つの質問を見つけました。これら2つの質問:

lpstatあなたが望むものを得るためにそれを使用できることを示唆しているようです。次のコマンドを実行できることがわかりました。

$ sudo lpstat -W completed
mfc-8480dn-1652         root              1024   Tue 28 Jan 2014 01:19:34 AM EST

これ:

$ sudo lpstat -W completed -u saml | head -2
mfc-8480dn-1524         saml             23552   Thu 28 Nov 2013 10:45:44 AM EST
mfc-8480dn-1526         saml            699392   Sat 30 Nov 2013 10:34:34 AM EST

しかし、彼らは-u all私に何の利益も与えませんでした。

$ sudo lpstat -W completed -u all | head -2
$

奇妙なことは、私がこれを行うことができるということです。

$ sudo lpstat -W completed -u saml,root | head -3
mfc-8480dn-1524         saml             23552   Thu 28 Nov 2013 10:45:44 AM EST
mfc-8480dn-1526         saml            699392   Sat 30 Nov 2013 10:34:34 AM EST
mfc-8480dn-1652         root              1024   Tue 28 Jan 2014 01:19:34 AM EST

したがって、ハッキングはシステムのユーザーリストを正式に決定し、それを-u次のようにパラメータにサブコマンドとして追加することです。

$ sudo lpstat -W completed -u $(getent passwd | \
    awk -F: '{print $1}' | paste -sd ',')

すべてのユーザーをローカルで表示できることを示すために、次のユニークなユーザーのリストを取得できます。

$ sudo lpstat -W completed -u $(getent passwd | \
    awk -F: '{print $1}' | paste -sd ',') | awk '{print $2}' | sort -u
ethan
root
sam
tammy

質問?

この問題の1つは、CUPSで印刷するユーザーがローカルアカウントを持っていない場合、そのアカウントが表示されないことです。

ただし、LPD制御ファイルを含むディレクトリがある場合は、通常/var/spool/cups , you'll notice a bunch of control files in there. These files are kept as a result of theMaxJobsが設定され、設定されていない場合、デフォルトは500です。

$ sudo ls -l /var/spool/cups/ | wc -l
502

ユーザー名の別のソースは何ですか?

これらのファイルを見ると、システムに存在するアカウントのユーザー名だけでなく、ユーザー名も含まれていることがわかります。

$ strings /var/spool/cups/* | grep -A 1 job-originating-user-name | head -5
job-originating-user-name
tammyB
--
job-originating-user-name
tammyB

したがって、ユーザー名の後にBを含むすべての項目を選択できます。

$ sudo strings /var/spool/cups/* | grep -A 1 job-originating-user-name | \
    grep -oP '.*(?=B)' | sort -u
ethan
guest-AO22e7
root
sam
saml
slm
tammy

getent passwdその後、このリストは、元の次のようにユーザーリストを取得するために使用したのと同じ方法で調整できます。

$ sudo lpstat -W completed -u $(strings /var/spool/cups/* | \
    grep -A 1 job-originating-user-name | \
    grep -oP '.*(?=B)' |sort -u | paste -sd ',') 
mfc-8480dn-1525         tammy           545792   Thu 28 Nov 2013 01:36:59 PM EST
mfc-8480dn-1526         saml            699392   Sat 30 Nov 2013 10:34:34 AM EST
mfc-8480dn-1652         root              1024   Tue 28 Jan 2014 01:19:34 AM EST
mfc-8480dn-1672         saml              1024   Sun 09 Feb 2014 01:56:26 PM EST

引用する

答え2

古い印刷ジョブをクリーンアップするより簡単な別の方法があります。印刷ジョブで短縮されたタイムスタンプを変換する方法を見つけるのではなく、findコマンドを使用して特定の基準を満たす古い印刷ジョブを削除することができます。たとえば、4日以上経過した印刷ジョブを見つけるには、次のようにします。

find /var/spool/cups -name "*-001" -mtime +4

カップのすべてのアクティブ印刷ジョブの/var/spool/cups拡張子はです-001。次に、お気に入りの文字列操作ツールを使用して、出力から実際の印刷ジョブ番号を取得します。

答え3

実際、これらすべてを完全に無視し、採用リストから日付を取得しようとしないでください。あなたは必要ありません正確な印刷ジョブタイムスタンプが必要ない場合(この場合でも、指定された日時がジョブが送信された時点であるか完了した時点であるかは、lpstatの出力またはマニュアルですぐには明確ではありません)

「完了した」ジョブのリストでジョブが検出された場合は、「現在」の日付スタンプを生成できるため、これをまったく実行する必要はありません。

._. printJob=$(lp somefile | awk '{print $4}')
._. printJobCompleted=$(lpstat -W "completed" | grep $printJob )
._. printedDatestamp=$(date +%s)

もちろん、仕事が終わる前に仕事が終わったとは言えません。したがって、それを検出するまで繰り返して眠りたいと思うかもしれません。

キューの日付が本当に必要な場合は、次のようにします。

印刷コマンドを送信するときに印刷ジョブIDを取得します。

._. printJob=$(lp somefile | awk '{print $4}')
._. echo $printJob
Kyocera-ECOSYS-P5021cdw-564

(lpには単に印刷ジョブを返すオプションがないようです。awkを介してlpの出力を解析する必要があります。)

._. lp somefile
request id is Kyocera-ECOSYS-P5021cdw-568 (1 file(s))

awk '{print $4}'この出力文字列の4番目の単語を取得します)。

次に、lpstatを使用して完了したジョブの詳細を取得します。

._. lpstat -W "completed" | grep $printJob
Kyocera-ECOSYS-P5021cdw-564 ming             2048   Sun 18 Apr 2021 11:20:56 BST

日付を含む部分を分離するのは少し厄介です。これは、lpstatがこれを行う直接的な方法を提供しているように見え、日付は複数の単語で構成されるためです。たぶん:

._. printJobDateString=$(lpstat -W "completed" | grep $printJob | awk '{print $4,$5,$6,$7,$8,$9}')

._. echo $printJobDateString
Sun 18 Apr 2021 11:20:56 BST

(また、awkは範囲をキャプチャする方法を提供していないようです。私が間違っている場合は訂正してください。)

...またはshellbuild-inで同じことを行いますread。理由は不明ですが、日付文字列全体を単一の単語として扱います(文字列の4番目の単語を出力します。ここで、readは最初の4つの単語を使用します。Marked with names a、b、c、d):

._. printJobDateString=$(lpstat -W "completed" | grep $printJob | while read a b c d; do echo "$d"; done)
._. echo $printJobDateString
Sun 18 Apr 2021 11:20:56 BST

最後に、より簡単に比較できるように、エポック以降の秒単位の日付スタンプに変換できます。

._. printedDatestamp=$(date --date="$printJobDateString" +%s)
._. echo $printedDatestamp
1618741256

lpstat の完了リストにジョブの履歴がない場合、printJobDateString は空です。この場合、日付をエポック秒に変換すると、日付は1970年1月1日と見なされます。

実際には、完了したジョブリストには、キャンセルされたジョブと完了したジョブの両方が含まれているため、印刷ジョブが完了したジョブリストに表示されない可能性があります。だから、以下の警告を無視してください。。はい。

しかし注意してください。、lpstat に印刷ジョブがない場合、空の文字列が返されます。 「日付」に空の文字列を指定すると、今日の日付が出力されます。これをスクリプトに含めると、今日の日付が表示されるため、操作が完了したと誤解される可能性があります。

たとえば、

._. date -d @$(date --date="" +%s) +"%F %T %z"
2021-04-17 00:00:00 +0100

そして 'date'はUnix 'epoch'の始まりとして0を使用します(素敵な時間の夜明け) - 1970年1月1日:

._. date -d @0 +"%F %T %z"
1970-01-01 01:00:00 +0100

これは、今日の日付よりも完了していないタスクを表すより有用な指標になる可能性があります。したがって、空の文字列を「date」に入力する前に、次のように0(存在する場合)に変換してください。

._. emptyString=""
._. zero=$( [[ -z "$emptyString" ]] && echo 0 || echo "$emptyString" )
._. echo zero
0

つまり、次の日付スタンプを生成します。

._. printedDatestamp=$(date --date="$( [[ -z "$printJobDateString" ]] && echo 0 || echo "$printJobDateString" )" +%s)

最後に、すべてのステップをまとめると次のようになります。

._. printJob=$(lp -P "1-4" -o fit-to-page -o number-up=2 -o sides=two-sided-short-edge -o KCEcoprint=On "$fn" | awk '{print $4}')
._. printJobDateString=$(lpstat -W "completed" | grep $printJob | while read a b c d; do echo "$d"; done)
._. printedDatestamp=$(date --date="$( [[ -z "$printJobDateString" ]] && echo 0 || echo "$printJobDateString" )" +%s)

ポリスチレン

sleeplpstat -W "not-completed"後でのみポーリングして印刷ジョブを送信した後、ループで使用することもできますlpstat -W "completed"

場所:印刷ジョブのタイムスタンプです。そして、誰がLinux印刷制御がユーザーフレンドリーであると言いましたか?誰も。誰もこのようなことを言ったことがありません。彼らがそれについて話したすべては、息を吐きながら呟いた。

関連情報