3

次の文字列を使用して、Linuxボックスでデッドレターキューハンドラーを作成しようとしています

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 

ただし、サービスの開始に失敗します。誰でもこれについて何か考えがありますか?

よろしくJ

4

1 に答える 1

0

これは、WebSphere MQ によるコマンドの実行方法に関係しています。シェル プログラムからテキスト ファイルを実行すると、便宜上、シェルはファイルの先頭にあるシバン行を探して、実行する実行可能ファイルを特定します。次に、指定されたプログラムを実行し、ファイルを引数として渡します。したがって、たとえば、スクリプトを実行/home/mqm/dlq/dlqhandler.shし、スクリプトの最初の行がシェルである場合、これはユーザーに代わって#! /bin/sh変換され、送信されます。/bin/sh /home/mqm/dlq/dlqhandler.shその結果、新しいサブシェルが開始され、スクリプト ファイルが引数として渡されます。

WebSphere MQ は OS を使用して、入力した内容を直接実行しSTARTCMDます。シェルによって実行される便利な置換はないため、指定したものがスクリプトである場合、OS はそれをどう処理するかを知りません。STARTARG(/bin/sh /home/mqm/dlq/dlqhandler.sh)OS はこれをコマンドや引数としてではなく、スペースが埋め込まれたコマンドとして認識するため、 に 変更しても役に立ちません。

ただし、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 

更新:
いくつかのテストの結果、Linux サーバーが制限付きシェルを実行するように構成されていることがわかりました。これにより、パス名を含む引数を渡すことができなくなり、この問題に関連して、 などの共有ドライブでホストされているものを実行できなくなりました/hom/mqm。制限された環境で、スクリプトとログをディレクトリの下に移動すると/var/mqm、問題は解決しました。

テスト中に、シェルの組み込みコマンドを使用して問題を切り分けることができました。これらにはパスやパーミッションの問題がないため、ファイルシステムのパーミッションなどを除外しました。たとえばSTARTCMD('/bin/sh') STARTARG('-c "echo It works"')、QMgr が/bin/sh正しく起動できたことがわかりました。スクリプトを読み取りにecho It works失敗した 1 行に変更すると、問題はスクリプトの内容ではなく、スクリプト自体にあることがわかりました。を使用するSTARTARG('-c set')と機能し、現在のディレクトリの場所と の内容が表示され$PATHました。スクリプトを現在のディレクトリに移動すると、アクセス許可の問題が解決され、さらにいくつかの実験を行ったところ、/失敗していたのはスクリプト パスにないことがわかりました。/home/mqmと の間に見られた唯一の明らかな違い/var/mqm1つは共有され、1つは専用マウントでした。最終的なサービス定義は次のとおりです。

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上記をルール ファイルへのパスに置き換えます。たとえば、デフォルトでインストールされたストック Linux でルール ファイルが期待+MQ_DATA_PATH+subdir/+QMNAME+.rules.tableされる場合があります。+MQ_DATA_PATH+exits/+QMNAME+.rules.table/var/mqm/exits

于 2012-10-30T12:45:05.987 に答える