Websphere MQ死信队列处理程序失败

时间:2012-10-30 12:28:01

标签: ibm-mq

我正在尝试使用以下字符串

在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 

但是服务无法启动。有没有人对此有任何想法?

此致 Ĵ

1 个答案:

答案 0 :(得分: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参数。如果您更改为使用以下命令(假设您的脚本的shebang行执行/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服务器配置为运行受限制的shell。这会阻止使用路径名传递参数,并且与此问题相关,执行托管在共享驱动器(例如/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中的规则文件。