从一个移动到另一台服务器的shell脚本
下面是这种情况,从一个移动到另一台服务器的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
可一些请大家指出,这里需要纠正的。
感谢, 维涅什
我认为真正的问题是,R(0)SH CMD只执行远程envscripts.ksh文件和脚本,然后尝试在本地计算机上执行qdisplay。
您需要将两个命令“粘合”在一起,以便它们都可以远程执行。 从吉尔斯根据注释编辑(他是正确的)
rosh -n ${server} -l mquser ". /opt/hd/ca/scripts/envscripts.ksh ; qdisplay"
我希望这有助于。
P.S.你似乎是一个新的用户,如果你得到一个答案,可以帮助您,请记得将其标记为接受,或者给它一个+(或 - )作为有用的答案
这还不够。您需要安排别名定义以及别名在同一个shell中的使用。由于定义在单独的脚本中,因此您需要提供定义脚本('.'命令),而不是将其作为单独的进程执行:'rosh -n $ {server} -l mquser“。/ opt/hd/ca /scripts/envscripts.ksh; qdisplay“'。 – Gilles 2011-03-08 22:13:33
正确,我已根据您的评论修改了我的答案。谢谢 – shellter 2011-03-09 01:01:45
Hello Shellter,我尝试了上述想法。但它不起作用。只有envscripts.ksh正在执行,但是作为另一个脚本的别名的“qdisplay”没有执行。注意:envscripts.ksh为其必需的脚本设置别名(qdisplay)。谢谢,Vignesh – Vignesh 2011-03-09 17:28:35
其他答复和意见是正确的。您的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