2

这是场景,

$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

有些人可以指出这里需要纠正的地方。

谢谢,维涅什

4

2 回答 2

1

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

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

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

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

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

十年前,当我的 WMQ 网络很小时,我编写了您正在处理的脚本。当网络变得更大时,这些平台差异吞噬了我,我无法保持自动化运行。当我切换到使用 WMQ 客户端并且只有一组脚本时,我能够以更少的时间和精力来维护它。

以下脚本假定 QMgr 名称与主机名相同,但大写除外。您可以改为在命令行上传递 QMgr 名称、主机名、端口和通道,以使脚本在 QMgr 名称与主机名不匹配的情况下有用。

#!/usr/bin/perl -w
#------------------------------------------------ ------------------------------
# mqsc.pl
#
# M072 SupportPac mqsc 可执行文件的包装器
# 在命令行上提供 parm 文件名并通过 STDIN 提供主机名。
# 程序尝试连接到 SYSTEM.AUTO.SVRCONN 和端口 1414 上的主机名
# 将 parm 文件重定向到 mqsc。
#
# 预期用途是...
#
# mqsc.pl parmfile.mqsc
# 主机1
# 主机2
#
#  -  或者  - 
#
# mqsc.pl parmfile.mqsc < 节点列表
#
#  -  或者  - 
#
# 猫节点列表 | mqsc.pl 参数文件.mqsc
#
#------------------------------------------------ ------------------------------
使用严格;
$SIG{ALRM} = sub { die "timeout" };

$ENV{PATH} =~ s/:$//;

我的 $File = 班次;
die "未提供 mqsc parm 文件名!" 除非$文件;
die "文件 '$File' 不存在!\n" 除非 -e $File;

尽管 () {
    我的@Results;
    咀嚼;
    接下来如果 /^\s*[#*]/; # 使用 # 或 * 允许评论
    s/^\s+//; # 删除前导空格
    s/\s+$//; # 删除尾随空格
    # 不接受名称中嵌入空格的主机
    die "ERROR: Invalid host name '$_'\n" if /\s/;

    # 静默跳过空行
    下一个除非 ($_);

    我的 $QMgrName = uc($_);

    #------------------------------------------------ --------------------------
    # 运行parm文件
    评估{
        警报(10);
        @Results = `mqsc -E -l -h $_ -p detmsg=1,prompt="",width=512 -c SYSTEM.AUTO.SVRCONN &1 | grep -v "^MQSC 结束"`;
    };

    如果($@){
        if ($@ =~ /timeout/) {
            print "连接到 $_\n 超时";
        } 别的 {
            print "连接到$_的意外错误:$!\n";
        }
    }
    警报(0);

    如果(@Results){
        打印连接(“\t”,@Results,“\n”);
    }
}
出口;

parmfile.mqsc 是任何有效的 MQSC 脚本。收集所有队列深度的方法如下所示:

显示 QL(*) 曲线
于 2011-03-09T20:53:30.663 回答
0

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

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

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

我希望这有帮助。

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

于 2011-03-08T20:02:00.273 回答