2012-10-30 55 views
3

我試圖創建Linux機器死信隊列處理程序與以下字符串的WebSphere MQ死信隊列處理程序故障

DEFINE SERVICE(dlqhandler) + CONTROL(MANUAL) + DESCR('DLQ Handler Service') + 
SERVTYPE(SERVER) + STARTCMD('/home/mqm/dlq/dlqhandler.sh') + 
STDOUT('/home/mqm/dlq/dlq.log') + 
STDERR('/home/mqm/dlq/dlq.err') + 
REPLACE 

但是服務將無法啓動。有沒有人對此有所瞭解?

問候 Ĵ

回答

0

這與如何命令由WebSphere MQ執行做。當你從一個shell程序中執行一個文本文件時,爲了方便起見,shell在文件的頭部尋找一個shebang行,以獲得有關可執行文件的線索。然後運行指定的程序並將該文件作爲參數傳遞。因此,例如,如果您運行/home/mqm/dlq/dlqhandler.sh,並且腳本中的第一行是#! /bin/sh,則shell將以此名稱將其轉換爲/bin/sh /home/mqm/dlq/dlqhandler.sh並提交。其效果是啓動一個新的子shell並將其腳本文件作爲參數傳遞給它。

WebSphere MQ使用操作系統直接執行您在STARTCMD字段中輸入的內容。 shell沒有方便的替換,所以如果你指定的是一個腳本,操作系統不知道該怎麼做。更改爲STARTARG(/bin/sh /home/mqm/dlq/dlqhandler.sh)將無濟於事,因爲操作系統將此視爲不是命令和參數,而是具有嵌入空間的命令。

但是,WebSphere MQ確實爲此提供了一個STARTARG參數。如果更改使用下面的命令(假設你的腳本的家當行執行/bin.sh)它應該工作:

DEFINE SERVICE(dlqhandler) + 
     CONTROL(MANUAL) DESCR('DLQ Handler Service') + 
     SERVTYPE(SERVER) STARTCMD('/bin/sh') + 
     STARTARG('/home/mqm/dlq/dlqhandler.sh') + 
     STDOUT('/home/mqm/dlq/dlq.log') + 
     STDERR('/home/mqm/dlq/dlq.err') + 
     REPLACE 

UPDATE:
經過一些測試,我們發現Linux服務器被配置爲運行受限制貝殼。這防止了路徑名稱的傳遞參數,並且與此問題相關,執行託管在共享驅動器上的任何東西,例如/hom/mqm。在受限制的環境中,將腳本和日誌移動到/var/mqm下的目錄解決了該問題。

在測試過程中,我們能夠通過使用shell內置命令來隔離問題。這些沒有路徑或權限問題,因此排除了文件系統權限等問題。例如,STARTCMD('/bin/sh') STARTARG('-c "echo It works"')告訴我們,QMgr能夠正確調用/bin/sh。將腳本更改爲只讀echo It works的單行失敗,告訴我們這不是腳本的內容,而是腳本本身的問題。使用STARTARG('-c set')工作並向我們展示了當前目錄的位置以及$PATH的內容。將腳本移動到當前目錄解決了權限問題,並且一些進一步的實驗顯示腳本路徑中的/不是失敗的。我們在/home/mqm/var/mqm之間看到的唯一明顯區別是共享一個,並且一個是專用安裝。最終服務定義如下:

DEFINE SERVICE(dlqhandler) + 
     CONTROL(QMGR) DESCR('DLQ Handler Service') + 
     SERVTYPE(SERVER) STARTCMD('/bin/sh') + 
     STARTARG('-c "+MQ_INSTALL_PATH+bin/runmqdlq < +MQ_DATA_PATH+subdir/+QMNAME+.rules.table"') + 
     STDOUT('+MQ_DATA_PATH+subdir/dlq.+QMNAME+.log') + 
     STDERR('+MQ_DATA_PATH+subdir/dlq.+QMNAME+.err') + 
     STOPCMD('+MQ_INSTALL_PATH+bin/amqsstop') + 
     STOPARG('-m +QMNAME+ -p +MQ_SERVER_PID+') + 
     REPLACE 

用規則文件的路徑替換上面的subdir。因此,例如,+MQ_DATA_PATH+subdir/+QMNAME+.rules.table可能是+MQ_DATA_PATH+exits/+QMNAME+.rules.table,它預計在缺省安裝的情況下庫存Linux上的/var/mqm/exits規則文件。

+0

嗨T.Rob,非常感謝您的回答。當我嘗試啓動這個服務時,我在dlq.err中得到如下提示'/ bin/sh:/home/mqm/dlq/dlqhandler.sh權限被拒絕'但是,如果我在dlqhandler.sh中手動運行命令,它可以正常工作。任何想法? – JiM

+0

Hi T.Rob,根據您的建議,將文件移動到MQ_DATA_PATH中對問題進行排序。非常感謝你。 – JiM

+0

試圖讓你的最終服務定義起作用,因爲這是我第一次看到一個不在STARTCMD中使用批處理文件/ shell腳本的例子。這真的是一個有效的例子嗎?不爲我發生:-( –