2011-03-08 150 views
2

下面是这种情况,从一个移动到另一台服务器的shell脚本

$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. 

在上面的脚本中,我登录到另一台服务器上说服务器2并执行脚本“envscripts.ksh”,它在其中定义了几个别名(Alias“qdisplay”)。

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

葛亭下面的错误,

-bash: qdisplay: command not found 

可一些请大家指出,这里需要纠正的。

感谢, 维涅什

+0

1.你的意思是rsh(而不是rosh)? 2.当你运行这个脚本时,你使用bash作为你本地的cmd行shell吗?3.是否是使用bash作为登录shell的$ {server}上的mquser? – shellter 2011-03-08 19:59:43

回答

0

我认为真正的问题是,R(0)SH CMD只执行远程envscripts.ksh文件和脚本,然后尝试在本地计算机上执行qdisplay。

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

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

我希望这有助于。

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

+0

这还不够。您需要安排别名定义以及别名在同一个shell中的使用。由于定义在单独的脚本中,因此您需要提供定义脚本('.'命令),而不是将其作为单独的进程执行:'rosh -n $ {server} -l mquser“。/ opt/hd/ca /scripts/envscripts.ksh; qdisplay“'。 – Gilles 2011-03-08 22:13:33

+0

正确,我已根据您的评论修改了我的答案。谢谢 – shellter 2011-03-09 01:01:45

+0

Hello Shellter,我尝试了上述想法。但它不起作用。只有envscripts.ksh正在执行,但是作为另一个脚本的别名的“qdisplay”没有执行。注意:envscripts.ksh为其必需的脚本设置别名(qdisplay)。谢谢,Vignesh – Vignesh 2011-03-09 17:28:35

1

其他答复和意见是正确的。您的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 
相关问题