Mangement of Print Queues on Oracle EBS
寫在前面的話
在ERP系統中,列印報表是不可或缺的應用之一。
由於Oracle本身的整合性,很多時候需要第三方工具的支援來一起完成某些任務,列印報表 即是其中一個的典型。
在Oracle EBS 11i以上版本中,一個典型的報表列印設定,就涉及到ERP應用中列印佇列的 管理、ERP主機上列印佇列的管理、列印伺服器上Remote Print Manager列印佇列的管理以 及遠端印表機的管理。
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應用中列印請求拋向外部(作業系統、印表機等)的出口,可以使用 作業系統命令、程式或者子例程的方式實現。
本例中,直接使用作業系統的列印命令,如下:
直接呼叫作業系統的列印命令進行列印,其中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