1. 程式人生 > >Mangement of Print Queues on Oracle EBS

Mangement of Print Queues on Oracle EBS

寫在前面的話

在ERP系統中,列印報表是不可或缺的應用之一。

由於Oracle本身的整合性,很多時候需要第三方工具的支援來一起完成某些任務,列印報表 即是其中一個的典型。

在Oracle EBS 11i以上版本中,一個典型的報表列印設定,就涉及到ERP應用中列印佇列的 管理、ERP主機上列印佇列的管理、列印伺服器上Remote Print Manager列印佇列的管理以 及遠端印表機的管理。

Oracle ERP列印佇列結構圖

Oracle ERP

列印伺服器

1. Windows印表機管理

在Windows中,有兩種方式新增印表機:

  • 1)圖形介面方式:在控制面板中,新增印表機和傳真

  • 2)命令列方式:C:\Windows\System32\prnmngr.vbs

當批量新增印表機時,使用圖形介面的方式實在是一件體力活。如在做列印伺服器遷移時, 將幾臺列印伺服器上的遠端印表機遷移到同一臺列印伺服器,此時使用嚮導介面則會非常耗 時,而且稍有不慎,就可能會勾選錯誤,導致印表機設定不正確;當然,出現問題也不好排 查。所幸的是,Windows也提供了vbs指令碼來管理印表機。

使用命令列管理印表機

使用命令列管理印表機需要Windows作業系統中有prnmngr.vbs指令碼,一般Windows XP, Windows Server 2003中會自帶這些指令碼,以下為簡單的學習筆記。

cscript prnmngr.vbs
cd  /D  C:\Windows\System32
cscript prnmngr.vbs
用法: prnmngr [-adxgtl?][c] [-s 伺服器][-p 印表機][-m 驅動程式型號]
             [-r 埠][-u 使用者名稱][-w 密碼]

引數:
-a     - 新增本地印表機
-ac    - 新增印表機連線
-d     - 刪除印表機
-g     - 獲取預設印表機
-l     - 列出印表機
-m     - 驅動程式型號
-p     - 印表機名
-r     - 埠名
-s     - 伺服器名
-t     - 設定預設印表機
-u     - 使用者名稱
-w     - 密碼
-x     - 刪除所有印表機
-?     - 顯示命令用法
 
例如:
prnmngr -a -p "印表機" -m "驅動程式" -r "lpt1:
prnmngr -d -p "印表機" -s 伺服器
prnmngr -ac -p "\\伺服器\印表機"
prnmngr -d -p "\\伺服器\印表機"
prnmngr -x -s 伺服器
prnmngr -l -s 伺服器
prnmngr -g
prnmngr -t -p "\\伺服器\印表機"
主要用法

新增本地印表機

cscript prnmngr.vbs -a -p PrinterName [-s RemoteComputer] -m DriverName -r PortName  [-u UserName] [-w Password]

示例

cscript prnmngr.vbs -a -p testptq_1 -m "Epson LQ-680Pro ESC/P 2"  -r LPT1:

刪除印表機

刪除指定印表機

cscript prnmngr.vbs -d -p PrinterName [-s RemoteComputer] [-u UserName] [-w Password]

刪除所有印表機,慎用!

cscript prnmngr.vbs -x [-s RemoteComputer] [-u UserName] [-w Password]

設定預設印表機

顯示預設印表機

cscript prnmngr.vbs -g

設定預設印表機

cscript prnmngr.vbs -t -p PrinterName

列出所有印表機

cscript prnmngr.vbs -l [-s RemoteComputer] [-u UserName -w Password]

示例

cscript prnmngr.vbs -l

新增遠端印表機

先建立tcp/ip埠

cscript prnport.vbs -a -r IP_192.168.1.111_1 -h 192.168.1.111 -o lpr -q testptq

再新增遠端印表機

cscript prnmngr.vbs -a -p testptq -m "Epson LQ-680Pro ESC/P 2" -r IP_192.168.1.111_1

印表機服務指令碼

  • prnmngr.vbs:新增或刪除印表機
  • prncnfg.vbs:配置印表機
  • prndrvr.vbs:新增或刪除印表機驅動程式
  • prnjobs.vbs:管理列印作業
  • prnqctl.vbs:管理列印測試頁、暫停印表機、繼續執行印表機或清除印表機佇列
  • prnport.vbs:新增或刪除印表機埠

2. RPM列印佇列管理

在Windows列印伺服器管理列印佇列,可以使用付費軟體Remote Print Manager。用來接收 來自ERP伺服器的列印請求,接收請求後,在RPM列印佇列中進行一些格式的調整或轉換,之 後,再將這些請求傳送給遠端印表機進行真正的列印作業。

目前主要接觸過RPM Elite 4.5和RPM 5.1.1.99,新版本的功能更加強大,管理也方便。

3. AIX列印佇列管理

基本概念

print job

  • 在印表機上執行的作業單元
  • 一個列印任務可以列印單個或多個檔案
  • 每個列印任務由job id 唯一標識

queue

  • 列印佇列用來管理列印任務
  • 配置:/etc/qconfig
  • 佇列名和佇列裝置

queue device

  • 佇列裝置,可以是本地、遠端等裝置

注:一個單獨的列印佇列可以與多個佇列裝置關聯

Print spooler

  • 管理列印的通用系統

日常管理

create
  • 命令:smit print
configure
  • /etc/qconfig

  • example:

    testptq: device = @testptq up = TRUE host = testptq
    s_statfilter = /usr/lib/lpd/bsdshort l_statfilter = /usr/lib/lpd/bsdlong rq = testptq
    @testptq: backend = /usr/lib/lpd/rembak

control
#lpstat

lpstat:顯示線性印表機的目前狀態資訊

usage: lpstat [-drstW][-aDestination,...][-cClassname,...]
              [-oOutRequirement,...][-pPrinter,...][-uUser,...]
              [-vPrinter,...] [jobid,...]
		Prints LP status information.

qchk:顯示某些列印任務、列印佇列的目前狀態資訊

lpq:顯示某些指定使用者、任務號的列印任務的狀態資訊

lpr:使用列印系統列印檔案

#stop
enq  -D -P 'testoffice:@testptq'  #D Down print queue
enq  -A -w Delay   #當列印隊任務完成時每間隔多少秒更新列印狀態資訊
#start
lpstat -vxxoffice              #status
enq -U -P 'xxoffice:@testptq'  #start queue
qchk -P  xxoffice              #status
enabl    xxoffice:@testptq     #start queue
#flush
lpstat -vxxoffice
qcan -P xxoffice -x 3          #cancel job 3 on queue xxoffice
cancel       3                 #cancel job 3
lprm -P xxoffice 3             #cancel job 3 on queue xxoffice
enq -P xxoffice  -x 3          #cancel job 3 on queue xxoffice

example:

# lpstat -vxxoffice
Queue   Dev   Status    Job Files              User         PP %   Blks  Cp Rnk
------- ----- --------- --- ------------------ ---------- ---- -- ----- --- ---
xxoffic @xxof DOWN    
              QUEUED    505 STDIN.966664       testmgr                1   1   1
              QUEUED    506 STDIN.622782       testmgr                1   1   2
              QUEUED    507 STDIN.581720       testmgr                1   1   3
: (FATAL ERROR) 0781-233 Unknown host xxoffice.

# qcan -P xxoffice -x 505
: (FATAL ERROR) 0781-233 Unknown host xxoffice.

# lpstat -vxxoffice     
Queue   Dev   Status    Job Files              User         PP %   Blks  Cp Rnk
------- ----- --------- --- ------------------ ---------- ---- -- ----- --- ---
xxoffic @xxof DOWN    

              QUEUED    506 STDIN.622782       testmgr                1   1   1

              QUEUED    507 STDIN.581720       testmgr                1   1   2

: (FATAL ERROR) 0781-233 Unknown host xxoffice.
# cancel 506
# lpstat -vxxoffice
Queue   Dev   Status    Job Files              User         PP %   Blks  Cp Rnk
------- ----- --------- --- ------------------ ---------- ---- -- ----- --- ---
xxoffic @xxof DOWN    
              QUEUED    507 STDIN.581720       testmgr                1   1   1
: (FATAL ERROR) 0781-233 Unknown host xxoffice.
#check
  • lpstat
  • ps ef grep qdaemon
  • make sure that system date is correct #enq -Y to register qconfig file
  • make sure /tmp directory is not full
  • obsolete queue:/var/spool/lpd/qdir and remove from /etc/qconfig
  • hosts can be pinged
命令彙總

Commands and equivalents

Submit print jobs   Status print jobs    Cancel print jobs
enq                 enq -A               enq -x
qprt                qchk                 qcan
lp                  lpstat               lprm
lpr                 lpq                  cancel

4. ERP列印佇列的管理

在ERP應用中列印佇列的設定主要包括印表機驅動、樣式、型別以及註冊等四個方面,使用者 在提交報表請求時選擇所需要的印表機即可完成想要的列印作業。

其中,列印驅動設定是重點。

印表機的驅動,是ERP應用中列印請求拋向外部(作業系統、印表機等)的出口,可以使用 作業系統命令、程式或者子例程的方式實現。

本例中,直接使用作業系統的列印命令,如下:

printer_driver

直接呼叫作業系統的列印命令進行列印,其中arguments內容如下:

 /usr/bin/iconv -f UTF-8 -t GB18030 $PROFILES$.FILENAME | lpr -P$PROFILES$.PRINTER -#$PROFILES$.CONC_COPIES -T"$PROFILES$.TITLE"

配置好列印驅動之後,還需要設定好列印樣式、列印型別;之後,就可以在ERP應用中註冊 列印佇列。

5.CentOS列印佇列管理

Oracle ERP也是一個跨平臺的應用,除了可以部署在Unix上,如IBM AIX,還可以部署在 Linux、Windows平臺,如CentOS等。

在CentOS上,提供了與AIX系統上類似的lpstat、cancel等cups印表機管理工具,只要熟悉 了AIX上列印作業管理,在其他平臺上上手十分容易。

CentOS中,也提供了兩種印表機管理方式,圖形介面和命令列。在使用過程中,若批量新 建列印佇列,則可以先以圖形嚮導設定一個列印佇列,測試通過後,再直接編輯配置檔案, 重啟列印伺服器即可。

CentOS中,印表機配置檔案:/etc/cups/printers.conf。編輯後,重啟cups服務。

測試

從Oracle ERP印表機設定中可以看出,在實際使用過程中,列印請求會首先從ERP應用中運 行完畢後以列印命令的方式拋向ERP伺服器;然後,ERP伺服器通過CUPS/lpd服務或協議將請 求傳送給遠端列印伺服器,這裡為RPM列印管理伺服器;在RPM列印管理伺服器上,又會進行 一些格式的調整或轉換,最後才將請求拋給遠端印表機進行真正的列印作業。

一個列印作業經過ERP應用、ERP伺服器、RPM伺服器、印表機最後才能真正變成手上拿著的 報表或者單據。若其中任何一個環節出現問題,列印作業則有可能出現異常,因此快速的排 查解決問題十分重要。這裡提供一個思路,類似於單元測試、整合測試的概念,自底向上, 從依賴性最小的環節開始測試,確保沒有問題,再測試依賴此服務的其他環節,直到最後能 夠形成一套完整、可用的列印服務。

在此例中,測試可能需要經過以下步驟:

1. Windows上印表機管理

新建TCP/IP埠,並建立遠端印表機後,列印測試頁,進行測試。

注:在測試前,確保遠端印表機可以ping通。

2. RPM上列印佇列管理

目前暫未找到直接測試RPM上列印佇列的方法

3. AIX上列印佇列管理

使用命令列測試

在ERP應用中,註冊的列印佇列使用命令列方式向ERP伺服器拋送列印請求,這裡可以直接在 OS上進行測試。

[[email protected]]# iconv -f UTF-8 -t GB18030 erp_printer.txt | lpr -Ptestptq -#1 -T"列印測試Oracle ERP"

然後,使用lpstat檢視OS上列印作業狀態,檢視RPM上列印作業計數等

注:在測試前,確保列印伺服器可以ping通,列印佇列和列印服務已經啟動;

列印時,可以列印中英文,測試下是否有亂碼發生。

4. ERP上列印佇列管理

設定好列印驅動、列印佇列後,提交列印請求,更改列印選項,選擇測試的印表機,提交請 求,檢視列印效果。

指令碼

在實際應用中,由於遠端印表機、網路、斷電重啟等原因,時常會出現ERP伺服器上列印隊 列down掉的情況,這時需要手動檢查遠端印表機的網路是否正常,並重啟列印佇列。

對於日常維護來說,這會是一件例行事務,若使用者要求列印業務需在上班時正常執行,則必 須把檢查列印佇列作為上班時的第一項任務,這樣無疑也佔用了寶貴的時間。

前面提到過AIX上一些列印佇列管理的命令,因此可以編寫簡單的shell指令碼,檢查網路、打 印佇列等,並嘗試重啟列印佇列,再部署成定時任務,出現問題時傳送郵件通知。這樣可以 將時間留給其他更重要的工作。

1.指令碼示意圖

2.checklp.sh 檢查佇列

#!/bin/ksh
#abstract:
#check lpstat
#history:
#2012-09-04 [email protected] first release
#variables
script_basepath=/u1/PROD/prodora/itsection/sys/lpd
mail_date=$(date +%Y-%m-%d\ %H:%M:%S)
receipt=[email protected]
hostname=$(hostname)

#path
export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin

#lpstat
lpstat_basepath=/var/spool/lpd/stat
lpstats=${lpstat_basepath}/s.*[email protected]*

#check hosts
checklp_log=${script_basepath}/checklp.log
if [ -e ${checklp_log} ]; then
    true > ${checklp_log}
else
    touch ${checklp_log}
fi

#check ping function
function check_ping {
    v_ping=$1
        if [ ${v_ping} == "" ]; then
            echo "!!!!!! hostname or ip could not be null or empty!" >> ${checklp_log} 2>&1
        else
            ping -c 1 -w 1 ${v_ping} &> /dev/null && result=0 || result=1
            if [ "${result}" == 0 ]; then
                echo ">>>>>> Host ${v_ping} is Up!"
            else
                echo "!!!!!! Host ${v_ping} is Down!" >> ${checklp_log} 2>&1
            fi
        fi
	return
}

#host list of print queue
host_list=$(ls -l ${lpstats} | cut -d "@" -f 2 | sort | uniq )
for v_host in ${host_list}
do
     check_ping ${v_host}
done

office_ip=${script_basepath}/office.ip
if [ ! -e ${office_ip} ]; then
    echo "!!!!!! office ip file ${office_ip} does not exist!" >> ${checklp_log} 2>&1
    exit 0
fi

#check lpstat
lplist=$(ls -l ${lpstats} | awk -F "." '{print $2 ":" $3}')
office_log=${script_basepath}/office.log
for v_printer in ${lplist}
do
    v_queue=$(echo ${v_printer} | cut -d ":" -f 1)
    v_host=$(echo ${v_printer} | cut -d "@" -f 2)
    lpstat -W -v${v_queue} > ${office_log} 2>&1
    v_down=$(grep "DOWN" ${office_log})
    v_error=$(grep "ERROR" ${office_log})
    if [ "${v_down}" != "" ]; then
        v_office=$(echo ${v_queue} | cut -d "-" -f 1)
        v_ip=$(grep ${v_office} ${officeip} | cut -d ":" -f 2)
        if [ "${v_ip}" != "" ]; then
            check_ping ${v_ip}
        fi
        echo "${v_down}" >> ${checklp_log} 2>&1
        #stop queue
        echo ">>>>>> enq -D -P${v_printer}"
        enq -D -P${v_printer} > ${restart_log} 2>&1
        #startup queue
        echo ">>>>>> enq -U -P${v_printer} ..."
        enq -U -P${v_printer} > ${restart_log} 2>&1
    elif [ "${v_error}" != "" ]; then
        echo "${v_error}" >> ${checklp_log} 2>&1
    fi
done
if [ -e ${office_log} ]; then
    true > ${office_log}
fi

#mail
if [ $(cat ${checklp_log} | wc -l) -gt 0 ]; then
    cat ${checklp_log} | mail -s "${mail_date}:${hostname} dba daily check of lpstat" ${receipt} 
fi

3.office.ip 辦事處IP

xxoffice:192.168.1.111
xx1office: 192.168.2.111
xx2office: 192.168.3.111
... ...
xxnoffice: 192.168.255.111

4.restartlp.sh 重啟所有佇列

#!/bin/ksh
#abstract:
#check lpstat
#history:
#2012-09-04     mis_ghb         first release
#2012-12-04     mis_ghb         restart all lpd queue
#variables
script_basepath=/u1/PROD/prodora/itsection/sys/lpd
mail_date=$(date +%Y-%m-%d\ %H:%M:%S)
receipt=[email protected]
hostname=$(hostname)

#path
export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin

#lpstat
lpstat_basepath=/var/spool/lpd
lpstats=${lpstat_basepath}/stat/s.*[email protected]*
lpd_qdir=${lpstat_basepath}/qdir

#check restartlp log file
restartlp_log=${script_basepath}/restartlp.log
if [ -e ${restartlp_log} ]; then
   true > ${restartlp_log}
else
   touch ${restartlp_log}
fi

#check qdir
qdir_grep=$(ls ${lpd_qdir} | grep -v ".core")
if [ -e "${qdir_grep}" == "" ]; then
        ls -l ${lpd_qdir} > ${restartlp_log}
fi

#check lpstat
lplist=$(ls -l ${lpstats} | awk -F "." '{print $2 ":" $3}')
for v_printer in ${lplist}
do
    #stop queue
    echo ">>>>>> enq -D -P${v_printer}"
    enq -D -P${v_printer} >  ${restart_log} 2>&1
    #startup queue
    echo ">>>>>> enq -U -P${v_printer} ..."
    enq -U -P${v_printer} >  ${restart_log} 2>&1
done

#mail
if [ $(cat ${restartlp_log} | wc -l) -gt 0 ]; then
   cat ${restartlp_log} | mail -s "${mail_date}:${hostname} dba daily check of lpstat" ${receipt} 
fi

5.testlp.sh測試列印佇列

#!/bin/ksh
#abstract:
#check lpstat
#history:
#2012-09-04     mis_ghb         first release
#variables
script_basepath=/u1/PROD/prodora/itsection/sys/lpd
content=${script_basepath}/printer_test.txt
current_date=$(date +%Y-%m-%d\ %H:%M:%S)

#path
export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin

lpq=$1
if [ "${lpq}" == "" ]; then
    echo "print queue must be specified!"
elif [ ! -e ${content} ]; then
    echo "print content file ${content} does not exist!"
else
    echo "iconv -f UTF-8 -t GB18030 ${content} | lpr -P${lpq} -#1 -T'Print Queue Test on Oracle EBS at ${current_date}'"
    iconv -f UTF-8 -t GB18030 ${content} | lpr -P${lpq} -#1 -T'Print Queue Test on Oracle EBS at ${current_date}'
fi

6. 其他

以上指令碼傳送的郵件若出現中文亂碼,可以使用iconv進行編碼轉換,如:

if [ `cat ${sqllog} | wc -l` -gt 0 ]; then
   iconv -f UTF-8 -t GB18030 ${sqllog} | mail -s "${mail_date}:${hostname} dba daily check of ${script_name}" ${receipt} 
fi

參考

  • IBM AIX Redbook:IBM @server p5 and pSeries Administration and Support for AIX 5L Version 5.3
blog comments powered by Disqus