CUPS 인쇄 작업의 타임스탬프 보기

CUPS 인쇄 작업의 타임스탬프 보기

CUPS에서 작업의 타임스탬프를 볼 수 있는 방법을 찾고 있습니다. 매뉴얼 페이지를 검색했는데 찾을 수 없는 것 같습니다.

장기적인 목표는 jobID에서 시간을 구문 분석하고 특정 기간이 지난 모든 작업을 자동으로 삭제하여 서버 과부하를 방지하는 스크립트를 갖는 것입니다. 내 CUPS 서버에는 2000개가 넘는 인쇄 대기열이 있습니다.

답변1

나는 U&L 사이트에서 이를 수행할 수 있는 방법에 대한 힌트를 제공하는 다음 두 가지 질문을 발견했습니다. 이 두 가지 질문:

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

컵의 모든 활성 인쇄 작업에는 확장자 /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}'해당 출력 문자열의 네 번째 단어를 가져옵니다).

그런 다음 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도 범위를 캡처하는 방법을 제공하지 않는 것 같습니다. 제가 틀렸다면 정정해 주세요.)

... 또는 쉘 내장으로 동일한 작업을 수행합니다 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은 비어 있습니다. 이 경우 날짜를 에포크 초로 변환하면 날짜는 1970년 1월 1일로 가정됩니다.

사실 그래도, 인쇄 작업이 "완료된" 작업 목록에 포함되지 않을 가능성은 거의 없습니다. 왜냐하면 이 목록에는 완료된 작업뿐만 아니라 취소된 작업도 포함되어 있는 것처럼 보이기 때문입니다.그러니 아래 경고를 무시하세요.. 하아.

그래도 조심하세요, lpstat에 인쇄 작업이 없으면 빈 문자열을 반환합니다. 그리고 'date'에 빈 문자열을 입력하면 오늘 날짜가 출력됩니다. 그리고 스크립트에 해당 내용이 있으면 오늘 날짜가 표시되므로 작업이 완료되었다고 오해할 수 있습니다.

예를 들어:

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

추신

또한 인쇄 작업을 보낸 후 빈 문자열 을 sleep얻을 때까지 계속 진행되는 루프에서 lpstat -W "not-completed". 그런 다음에만 설문 조사를 수행하십시오 lpstat -W "completed".

거기에는 인쇄 작업의 타임스탬프가 있습니다. 그리고 리눅스 인쇄 제어가 인도적이라고 말한 사람은 누구였습니까? 아무도. 아무도 그런 말을 하지 않았습니다. 그리고 그들이 그것에 대해 말한 것은 무엇이든 숨죽여 중얼거렸습니다.

관련 정보