其他答覆和意見是正確的。您的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