2012-10-30 54 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脚本的例子。这真的是一个有效的例子吗?不为我发生:-( –