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

ここで修正が必要な点を指摘してください。

ありがとう、Vignesh

4

2 に答える 2

1

他の回答とコメントは正しいです。コマンドは、同じ呼び出しでkshrshスクリプトと後続のコマンドの両方を実行する必要があります。しかし、私は追加の提案を提供したいと思いました。

WebSphereMQ用のカスタムインスツルメンテーションを作成しているようです。あなたのアプローチは、WMQサーバーにリモートシェルし、コマンドを実行してキュー属性(おそらく深さ)を表示することです。

独自のインストルメンテーションを作成する目的は称賛に値しますが、リモートシェルとして作成することは最適なアプローチではありません。各MQサーバーでスクリプトのライブラリを維持する必要があり、場合によっては、これらのスクリプトを異なる言語で維持する必要があります。

SupportPacMO72で利用可能なMQSCクライアントを使用するのがはるかに優れたアプローチであることをお勧めします。これにより、スクリプトを1回記述してから、中央サーバーから実行することができます。MQSCコマンドはすべてMQクライアントを介して実行されるため、同じスクリプトがWindows、UNIX、Linux、iSeriesなどを処理します。

たとえば、キュ​​ーの深さをリモートで照会し、深さが0より大きいすべてのキューのリストを出力するスクリプトを作成できます。次に、このスクリプトを特定のキューマネージャーに対して直接実行するか、キューマネージャーのリストを反復処理するスクリプトを作成します。ネットワーク全体について同じレポートを収集します。$PATHスクリプトはすべて1つの中央サーバーで実行されているため、正しく動作することや、trやgrepなどのコマンドの違い、kshやperlがインストールされている場所などについて心配する必要はありません。

10年前、WMQネットワークが小さかったときに作業しているスクリプトを作成しました。ネットワークが大きくなると、これらのプラットフォームの違いが私を生き生きとさせ、自動化を継続して実行することができなくなりました。WMQクライアントの使用に切り替えて、スクリプトのセットが1つしかない場合、はるかに少ない時間と労力でそれを維持することができました。

次のスクリプトは、大文字を除いて、QMgr名がホスト名と同じであることを前提としています。代わりに、コマンドラインでQMgr名、ホスト名、ポート、およびチャネルを渡して、QMgr名がホスト名と一致しない場合にスクリプトを役立つようにすることができます。

#!/ usr / bin / perl -w
#------------------------------------------------- ------------------------------
#mqsc.pl
#
#M072SupportPacmqsc実行可能ファイルのラッパー
#コマンドラインでparmファイル名とSTDINを介してホスト名を指定します。
#プログラムは、SYSTEM.AUTO.SVRCONNおよびポート1414のホスト名に接続しようとします
#parmファイルをmqscにリダイレクトします。
#
#使用目的は...
#
#mqsc.pl parmfile.mqsc
#host1
#host2
#
#  -  また  - 
#
#mqsc.plparmfile.mqsc<ノードリスト
#
#  -  また  - 
#
#猫ノードリスト| mqsc.pl parmfile.mqsc
#
#------------------------------------------------- ------------------------------
厳密に使用します。
$ SIG {ALRM} = sub {die "timeout"};

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

私の$File=シフト;
「mqscparmファイル名が指定されていません!」$Fileでない限り;
-e $ Fileでない限り、「ファイル'$ File'は存在しません!\n」です。

その間 () {
    私の@Results;
    チョップ;
    次の場合/^\ s * [#*] /; #または*を使用してコメントを許可する
    s / ^ \ s + //; #先頭の空白を削除する
    s / \ s + $ //; #末尾の空白を削除する
    #名前にスペースが埋め込まれているホストを受け入れない
    / \ s /の場合、「エラー:無効なホスト名'$_'\n」で終了します。

    #空白行を黙ってスキップする
    次の場合($ _);

    私の$QMgrName= uc($ _);

    #------------------------------------------------- ---------------------------
    #でparmファイルを実行します
    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 "$ _\nへの接続がタイムアウトしました";
        } そうしないと {
            print "$ _への接続中に予期しないエラーが発生しました:$!\ n";
        }
    }
    alarm(0);

    if(@Results){
        print join( "\ t"、@Results、 "\ n");
    }
}
出口;

parmfile.mqscは、任意の有効なMQSCスクリプトです。すべてのキューの深さを収集するものは次のようになります。

QL(*)CURDEPTHを表示
于 2011-03-09T20:53:30.663 に答える
0

本当の問題は、r(o)sh cmd がリモートの envscripts.ksh ファイルのみを実行し、スクリプトがローカル マシンで qdisplay を実行しようとしていることだと思います。

2 つのコマンドを「接着」して、両方がリモートで実行されるようにする必要があります。ジルからのコメントごとに編集(彼は正しい)

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

これが役立つことを願っています。

追伸、あなたは新しいユーザーのようです。役立つ回答が得られた場合は、承認済みとしてマークすることを忘れないでください。または、有用な回答として + (または -) を付けてください。

于 2011-03-08T20:02:00.273 に答える