2011-03-08 143 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 
相關問題