首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Websphere死信队列处理程序失败

问Websphere死信队列处理程序失败
EN

Stack Overflow用户
提问于 2012-10-30 12:28:01
回答 1查看 1.7K关注 0票数 3

我正试图使用以下字符串在linux框上创建一个死信队列处理程序

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

发布于 2012-10-30 12:45:05

这与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),它应该可以工作:

代码语言:javascript
复制
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之间唯一明显的区别是,一个是共享的,另一个是专用的挂载。最后的服务定义是:

代码语言:javascript
复制
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,它期望默认安装的/var/mqm/exits上的/var/mqm/exits中的规则文件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13138988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档