其他答复和意见是正确的。您的rsh
命令需要在同一个调用中执行ksh脚本和后续命令。不过,我想我会提供一个额外的建议。
看来您正在为WebSphere MQ编写自定义检测。你的方法是远程shell到WMQ服务器并执行一个命令来显示队列属性(可能是深度)。
编写自己的工具的目的是令人钦佩的,但是试图做到这一点,因为远程shell并不是最佳方法。它要求您在每台MQ服务器上维护一个脚本库,并且在某些情况下需要使用不同的语言来维护这些脚本。
我建议更好的方法是使用SupportPac MO72中提供的MQSC客户端。这允许您编写脚本一次,然后从中央服务器执行它们。由于MQSC命令全部通过MQ客户端完成,因此相同的脚本可以处理Windows,UNIX,Linux,iSeries等。
例如,您可以编写一个远程查询队列深度的脚本,并打印所有队列列表深度> 0.然后,您可以直接针对给定的队列管理器执行此脚本,也可以编写脚本来遍历队列管理器列表,并为整个网络收集相同的报告。由于这些脚本都在一台中央服务器上运行,因此您不必担心正确获取$PATH
,诸如安装ksh或perl等tr或grep等命令的差异等。
十年前,我写了你正在处理的脚本,当我的WMQ网络很小。当网络变得更大时,这些平台差异使我活跃起来,并且无法保持自动化运行。当我切换到使用WMQ客户端并且只有一组脚本时,我能够以更少的时间和精力维持它。
以下脚本假定QMgr名称与主机名称相同,但在大写的情况下除外。您可以在命令行上传递QMgr名称,主机名,端口和通道,以便在QMgr名称与主机名不匹配时使脚本有用。
#!/usr/bin/perl -w
#-------------------------------------------------------------------------------
# mqsc.pl
#
# Wrapper for M072 SupportPac mqsc executable
# Supply parm file name on command line and host names via STDIN.
# Program attempts to connect to hostname on SYSTEM.AUTO.SVRCONN and port 1414
# redirecting parm file into mqsc.
#
# Intended usage is...
#
# mqsc.pl parmfile.mqsc
# host1
# host2
#
# -- or --
#
# mqsc.pl parmfile.mqsc < nodelist
#
# -- or --
#
# cat nodelist | mqsc.pl parmfile.mqsc
#
#-------------------------------------------------------------------------------
use strict;
$SIG{ALRM} = sub { die "timeout" };
$ENV{PATH} =~ s/:$//;
my $File = shift;
die "No mqsc parm file name supplied!" unless $File;
die "File '$File' does not exist!\n" unless -e $File;
while() {
my @Results;
chomp;
next if /^\s*[#*]/; # Allow comments using # or *
s/^\s+//; # Delete leading whitespace
s/\s+$//; # Delete trailing whitespace
# Do not accept hosts with embedded spaces in the name
die "ERROR: Invalid host name '$_'\n" if /\s/;
# Silently skip blank lines
next unless ($_);
my $QMgrName = uc($_);
#----------------------------------------------------------------------------
# Run the parm file in
eval {
alarm(10);
@Results = `mqsc -E -l -h $_ -p detmsg=1,prompt="",width=512 -c SYSTEM.AUTO.SVRCONN &1 | grep -v "^MQSC Ended"`;
};
if ([email protected]) {
if ([email protected] =~ /timeout/) {
print "Timed out connecting to $_\n";
} else {
print "Unexpected error connecting to $_: $!\n";
}
}
alarm(0);
if (@Results) {
print join("\t", @Results, "\n");
}
}
exit;
的parmfile.mqsc是任何有效的MQSC脚本。收集所有队列深度的示例如下所示:
DISPLAY QL(*) CURDEPTH
1.你的意思是rsh(而不是rosh)? 2.当你运行这个脚本时,你使用bash作为你本地的cmd行shell吗?3.是否是使用bash作为登录shell的$ {server}上的mquser? – shellter 2011-03-08 19:59:43