查看 CUPS 列印作業的時間戳

查看 CUPS 列印作業的時間戳

我正在尋找一種方法來查看 CUPS 中作業的時間戳記。我搜尋了手冊頁,似乎找不到它。

長期目標是擁有一個腳本,可以解析 jobID 中的時間,並自動刪除超過特定年齡的任何作業 - 以避免伺服器過載。我的 CUPS 伺服器有超過 2000 個列印佇列。

答案1

我在 U&L 網站中發現了以下兩個問題,它們似乎給出了實現此目的的可能方法的提示。這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

問題?

這樣做的一個問題是,如果列印到 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

cups 中所有活動的列印作業都有/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

(有必要透過 awk 解析 lp 的輸出,因為 lp 似乎沒有選擇簡單地返回列印作業):

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

awk '{print $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 似乎也沒有提供捕獲範圍的方法 - 如果我錯了,請糾正我)。

……或對 shellbuilt-in 執行相同的操作read,由於我不知道的原因,它確實將整個日期字串視為單字(輸出字串中的第四個單詞,其中read 將前四個單字標記為名稱 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 將為空。在這種情況下,當您將日期轉換為紀元秒時,日期將假定為 1/1/1970。

其實雖然,您的列印作業不太可能不會出現在「已完成」作業清單中,因為該清單似乎會收集已取消的作業以及已完成的作業。所以忽略下面的警告。哈。

但要小心,如果 lpstat 沒有您的列印作業,它將傳回一個空字串。如果您向“日期”提供一個空字串,它會輸出今天的日期。如果您在腳本中包含該內容,它可能會誤導您認為工作已經完成,因為它會給您今天的日期。

例如:

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

而 'date' 將 0 為 Unix 'epoch' 的開始(美好時光的黎明) - 1970 年 1 月 1 日:

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

這可能比今天的日期更有用地指示未完成的工作。因此,在將空字串輸入“date”之前,將其轉為零(如果有的話),也許像這樣:

._. 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)

聚苯乙烯

sleep發送列印作業後,也可以在一個循環中使用,透過在lpstat -W "not-completed".然後才輪詢lpstat -W "completed"

其中:列印作業的時間戳記。而誰說linux列印控制人性化呢?沒有人。沒有人說過這樣的話。他們對此所說的任何話都低聲嘀咕。

相關內容