這與如何命令由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
規則文件。
嗨T.Rob,非常感謝您的回答。當我嘗試啓動這個服務時,我在dlq.err中得到如下提示'/ bin/sh:/home/mqm/dlq/dlqhandler.sh權限被拒絕'但是,如果我在dlqhandler.sh中手動運行命令,它可以正常工作。任何想法? – JiM
Hi T.Rob,根據您的建議,將文件移動到MQ_DATA_PATH中對問題進行排序。非常感謝你。 – JiM
試圖讓你的最終服務定義起作用,因爲這是我第一次看到一個不在STARTCMD中使用批處理文件/ shell腳本的例子。這真的是一個有效的例子嗎?不爲我發生:-( –