수동으로 인쇄가 해제될 때까지 모든 인쇄 작업을 보류하도록 내 컵 인쇄 서버에 지시하고 싶습니다.
사용은 cupsdisable --hold <printer or class>
프린터를 일시 중지하고 lpoptions -p <printer> -o hold-job-until=indefinite
로컬로 제출된 인쇄 작업에 대해 작동하지만 원격으로 전송된 작업에는 작동하지 않습니다. 수동으로 릴리스될 때까지 모든 작업을 유지하도록 컵을 구성하려면 어떻게 해야 합니까?
답변1
들어오는 각 인쇄 작업을 일시 중지하도록 설정하는 머그 구성 옵션을 찾지 못했습니다. 나는 작업을 수행하기 위해 bash 스크립트를 작성했습니다.
#!/bin/bash
# cups_hold_new_jobs [<printer>]
# Resume a cups printer, set all queued and newly incoming jobs on
# hold, pause printer and exit.
# Runs as long as there are jobs in the print queue. Start from cron.
DEBUG=false
# --------- do not edit below ---------
VERSION=0.3
VERSION_INFO="(c) 2024 by Adrian Zaugg under GNU General Public License Version 3."
# initiate job list
declare -a JOBS
# set defaults
LOCK="/run/$(basename "$0")"
LOCKED=false
OWNPIDPPID="$$ $PPID "
# get job list
function get_job_list() {
JOBS=($(lpstat -o "$PRINTER" | sed -e 's/^\('"$PRINTER"'-[0-9]\+\).*$/\1/g'))
}
# DEBUG variable must be set to true or false
if [[ "$DEBUG" != "true" && "$DEBUG" != "false" ]]; then
DEBUG=false
fi
# cups must be running
if [ $(lpstat -r | grep -c "is running") -eq 0 ]; then
$DEBUG && echo "[INFO] CUPS is not running. Nothing to do." >&2
exit 0
fi
# get printer (or class?)
PRINTER="$1"
# get default printer if none was given as an argument or check given printer name
if [ -z "$PRINTER" ]; then
PRINTER="$(lpstat -p -d 2>/dev/null | grep "^system default destination: " | sed -e 's/^system default destination: //')"
# check
if [ -z "$PRINTER" ]; then
echo "[ERROR] No printer given on command line and unable to detect default printer." >&2
exit 1
else
$DEBUG && echo "No printer given on command line, using default printer: $PRINTER" >&2
fi
else
# no space, hash, slash or newline in printer names allowed
PRINTER="$(echo "$PRINTER" | head -1 | sed -e "s%/.*$%%" -e "s/#.*$//" -e "s/ .*$//")"
if [ ${#PRINTER} -lt ${#1} ]; then
echo "[ERROR] Disallowed characters in printer name found."
exit 1
fi
# check given printer exists
ERR="$(lpstat -p "$PRINTER" 2>&1)"
if [ $? -ne 0 ]; then
# printer does not exist or other error
echo "[ERROR] No printer printer \"$PRINTER\" found." >&2
exit 1
else
$DEBUG && echo "Using printer: $PRINTER" >&2
fi
fi
# lock
while ! $LOCKED; do
mkdir "$LOCK" 2>/dev/null
if [ $? -eq 0 ]; then
LOCKED=true
break;
elif [ $(ps -e -o pid,ppid,command | sed -n "s/\([0-9]\{1,\}\)[^0-9]\{1,\}\([0-9]\{1,\}\)[^0-9]\(.*\)$/\1\t\2\t\3/p" | \
grep -v "$OWNPIDPPID" | grep -cE 'bash .*/'"$(basename "${0}")"'$') -gt 1 ]; then
# process already started
$DEBUG && echo "Another instance of this script is already running." >&2
exit 0
else
# stale lock, remove it
rmdir "$LOCK" 2>/dev/null
if [ $? -ne 0 ]; then
echo "[ERROR] Removing stale lock $LOCK failed." >&2
exit 1
else
$DEBUG && echo "Removed stale lock." >&2
fi
fi
done
# pause printer
if [ $(lpstat -p "$PRINTER" | grep -c -m 1 "$PRINTER disabled") -eq 0 ]; then
cupsdisable "$PRINTER"
$DEBUG && echo "Printer paused." >&2
fi
PRINTER_PAUSED=true
# loop as long as there are jobs in the queue
get_job_list
until [ ${#JOBS[@]} -eq 0 ]; do
# find index of last held job in new job list
last_held_job_index=0
unset job_id
while [[ "${JOBS[$last_held_job_index]}" != "$last_held_job_id" && $last_held_job_index -le ${#JOBS[@]} ]]; do
last_held_job_index=$(($last_held_job_index+1))
done
if [ $last_held_job_index -eq ${#JOBS[@]} ]; then
# job not found
last_held_job_index=-1
fi
# set newly queued jobs on hold
i=0
for job_id in ${JOBS[@]}; do
# compare index to marker of last held index
if [ $i -gt $last_held_job_index ]; then
# set job on hold
ERR="$(lp -i "$job_id" -H hold 2>&1)"
if [ $? -eq 0 ]; then
echo -e "[INFO] holding job $job_id" >&2
else
echo "[ERROR] Failed to hold job \"$job_id\": $ERR" >&2
fi
# remember last index
last_held_job_index=$i
fi
i=$(($i+1))
done
last_held_job_id="${JOBS[$last_held_job_index]}"
# wait a bit
sleep 1
# reread jobs in print queue
get_job_list
# enable printer now
if $PRINTER_PAUSED; then
cupsenable "$PRINTER"
PRINTER_PAUSED=false
fi
done
# queue is now empty disable printer
if $PRINTER_PAUSED; then
$DEBUG && echo "Queue is empty." >&2
else
cupsdisable "$PRINTER"
echo "[INFO] Queue is empty now, pausing printer $PRINTER." >&2
fi
# unlock
if $LOCKED; then rmdir "$LOCK"; fi
exit 0
스크립트는 시작 시 프린터를 일시 중지하고, 모든 기존 작업을 일시 중지하도록 설정하고, 새로 들어오는 작업에 대해 동일한 작업을 수행하고, 프린터 일시 중지를 해제하고 대기열이 비워질 때까지 기다립니다. 종료 후 프린터가 다시 일시 중지됩니다.
아이디어는 인쇄 작업이 소유자에 의해 수동으로 해제되거나 취소될 수 있다는 것입니다(또는 머그에 MaxHoldTime을 설정하여 자동으로 취소됨). 이것은 간단한 풀 프린팅 시스템의 일부입니다.
이것은 스크립트의 첫 번째 버전으로, 경쟁 조건이 있고, cron으로 호출해야 하며, 도움말 텍스트가 누락되어 있고, asf 클래스에 대해 테스트되지 않았습니다. 기능을 추가하거나 수정하면 게시하겠습니다.다운로드 링크이 답변에서. 그것을 사용하는 것은 당신 자신의 책임입니다. 프로덕션에 사용하기 위한 것이 아니라 어떻게 수행할 수 있는지에 대한 아이디어를 제공하기 위해 여기에 있습니다.
Cup에 들어오는 모든 작업을 일시 중지하도록 지시하는 더 쉬운 방법이 있다는 소식을 들으니 반갑습니다.많은 추가 소프트웨어 없이도 Follow me 프린팅 시스템을 구축할 수 있습니다.
다운로드: 탭이 누락되었을 수 있으므로 위 항목을 복사하지 못했습니다. 다운로드 링크를 사용하세요.https://ente.limmat.ch/ftp/pub/software/bash/cups/