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 the
MaxJobs가 설정되고 설정되지 않은 경우 기본값은 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는 범위를 캡처하는 방법을 제공하지 않는 것 같습니다. 제가 틀렸다면 정정해 주십시오.)
...또는 shellbuild-in으로 동일한 작업을 수행합니다 read
. 이유는 알 수 없지만 전체 날짜 문자열을 단일 단어로 처리합니다(문자열의 네 번째 단어를 출력합니다. 여기서 read는 처음 네 단어를 사용합니다. 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)
폴리스티렌
sleep
lpstat -W "not-completed"
이후에만 폴링 하여 인쇄 작업을 보낸 후 루프에서 사용할 수도 있습니다 lpstat -W "completed"
.
위치: 인쇄 작업의 타임스탬프입니다. 그리고 누가 Linux 인쇄 제어가 사용자 친화적이라고 말했습니까? 아무도. 누구도 이런 말을 한 적이 없습니다. 그들이 그것에 대해 말한 모든 것은 숨을 쉬면서 중얼거렸다.