在shell脚本中从一个服务器移动到另一个服务器

时间:2011-03-08 10:54:31

标签: unix ksh ibm-mq rsh

这是方案,

$hostname
server1

我在server1中有以下脚本,

#!/bin/ksh
echo "Enter server name:"
read server

rsh -n ${server} -l mquser "/opt/hd/ca/scripts/envscripts.ksh"
qdisplay
 # script ends.

在上面的脚本中,我正在登录另一台服务器,例如server2并执行脚本“envscripts.ksh”,该脚本中设置了很少的别名(别名“qdisplay”)。

我能够成功登录到server1但无法使用脚本“envscripts.ksh”设置的别名。

获得以下错误,

-bash: qdisplay: command not found

有些人可以指出需要在这里纠正的内容。

谢谢, 维涅什

2 个答案:

答案 0 :(得分:1)

其他回复和评论是正确的。您的rsh命令需要在同一个调用中执行ksh脚本和后续命令。但是,我想我会提出一个额外的建议。

您似乎正在为WebSphere MQ编写自定义检测。您的方法是远程shell到WMQ服务器并执行命令以显示队列属性(可能是深度)。

编写自己的工具的目标是令人钦佩的,但是尝试将其作为远程shell进行操作并不是最佳方法。它要求您在每个MQ服务器上维护脚本库,并在某些情况下以不同语言维护这些脚本。

我建议更好的方法是使用SupportPac MO72中提供的MQSC客户端。这允许您编写一次脚本,然后从中央服务器执行它们。由于MQSC命令都是通过MQ客户端完成的,因此相同的脚本可以处理Windows,UNIX,Linux,iSeries等。

例如,您可以编写远程查询队列深度的脚本,并打印深度为>的所有队列的列表。然后,您可以直接针对给定的队列管理器执行此脚本,也可以编写脚本来迭代队列管理器列表并为整个网络收集相同的报告。由于脚本都在一个中央服务器上运行,因此您不必担心$PATH正确,tr或grep等命令的差异,安装ksh或perl等等。

十年前,当我的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 ($@) {
        if ($@ =~ /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 :(得分:0)

我认为真正的问题是r(o)sh cmd只执行远程envscripts.ksh文件,然后您的脚本尝试在本地计算机上执行qdisplay。

您需要将两个命令“粘合”在一起,以便它们都可以远程执行。 根据Gilles的评论编辑(他是正确的)

rosh -n ${server} -l mquser ". /opt/hd/ca/scripts/envscripts.ksh ; qdisplay"

我希望这会有所帮助。

P.S。因为您似乎是新用户,如果您得到的答案可以帮助您,请记住将其标记为已接受,或者给它一个+(或 - )作为有用的答案