最初のページに戻ります。

総合の目次があるページに戻ります。

よく使うマニュアルです

Wiki

updated on 2004.06.23

13.8.FTPで遠隔からコマンド実行

[ Previous ] [ HOME ] [ Upper ] [ Next ]


AS/400(1) - AS/400 (2) でつないでいて、(1)で、開発した、ファイルのサイズ情報を収集するプログラムを、(2)にコピーして、さて、どうやって実行しようかななんて、思っているときは、FTPでRCMDを使ってみましょう。

つまりは、(1)から、(2)へFTPでログインして、プログラム実行して、ファイルを(1)へコピー(つまり、(1)から見て、GET)をすることで解決します。

1. データ作成 by an RPG on Remote Machine

2.作成されたデータの取り出し by GET 

を、(1)からするのですね。まるで、(1)でRJEを起動しているかのようなものです。

最初にソースファイルを作成します。レコード長は92でも、112でもかまいません。また、作成するメンバータイプはTXTにしましょう。残念ながら、FTPコマンドを解釈して、編集エラーなどの検査をしてくれる機能はないので、プレーンな、TXTにするしかないのです。

手順1... FTPコマンドの準備

File : QFTPSRC ,Source Member : GETXXXX

0001.00  FTPUSER XXXXX 
0002.00  BINARY
0003.00  CD XXXLIB
0004.00  QUOTE RCMD CALL XXXXXXXXX 
0005.00  GET XXXLIB/FILE  XXXLIBP/FILE.XXXX (REPLACE
0006.00  QUIT 

解説

0001.00 これは、このFTPのジョブが、相手のFTPサーバーにログインするときのユーザー名+パスワードです。この処理を通過すると、相手側にFTPのジョブができます。よく勘違いしている人がいますが、手動にてFTPを開始して、QUOTE RCMD DSPJOBLOGをしても、それを実行しているJOBLOGが出てくるわけではなく、ログオン先のマシン(FTPサーバー側)に、そのスプールが出ています。したがって、QTEMPの所属も、実行元(クラインアント)ではなく、相手のサーバー側です。

0002.00 ここでは、AS/400 - AS/400間で考えていますので、無変換(Binary)です。

0003.00 これは、本当は無くてもいいのですが、実行環境にライブラリーXXXLIBを入れています。確か、CURLIBになっていると思います。

http://publib.boulder.ibm.com/pubs/html/as400/v4r5/ic2962/info/RZAIQCD.HTM#HDRRZAIQCD

004.00 ここがポイントの1です。データをログオン先のあるファイルに書き出すプログラムを呼び出しています。CLPなどで、環境設定を含めるものを呼び出す方が合理的でしょう。また、MONMSGはきちんとしましょう。

http://publib.boulder.ibm.com/pubs/html/as400/v4r5/ic2962/info/RZAIQRCMD.HTM#HDRRZAIQRCMD

0005.00 ここがポイントの2です。作成されたデータを、GETコマンドで、取り出しています。

http://publib.boulder.ibm.com/pubs/html/as400/v4r5/ic2962/info/RZAIQGET.HTM#HDRRZAIQGET

0006.00 ログオフです。

手順2 ... バッチでFTP実行

PGM
	RMVM          QFTPSRC  MBR(GETXXXXLOG)
	OVRDBF INPUT  QFTPSRC  MBR(GETXXXX)
	OVRDBF OUTPUT QFTPLOG  MBR(GETXXXX)
	FTP (' ホスト名やipアドレス')
	DLTOVR (INPUT OUTPUT)
	..... LOGの内容から、実行が正常か判断するプログラムを流す 
ENDPGM

INPUTやOUTPUTは、決まりごとです。

  1. INPUTは、FTPジョブに与えられるコマンドを指定します。上記の例では、手順1の内容が、1行1ジョブステップとして手渡されます。

  2. OUTPUTは、上記のジョブのログのエコーを記録します。上記の例では、コマンドを含むソースファイルと同じファイルで異なるメンバーに書き出しています。基本的にレコード追加のみなので、最初にRMVMしています。
    ※余談ですが、CLRPFM は、内部的には、RMVM + ADDPFMをしているだけのようです。

  3. 上記のようにした後で、FTPを開始すると、バッチで、ジョブを実行してくれます。

  4. 応用として、相手のライブラリーをSAVFに保管して、そのSAVFをGETする、という方法も考えられます。確か、前の会社でそんなことをしていました。 >Z君元気?

さらにもう一歩

エラーの出方

こんな感じになります

File Transfer Protocol 	                            
  	  	       	  	                                                                   
 	Previous FTP subcommands and messages: 	                                        
 	> QUOTE RCMD CHGJOB  LOGCLPGM(*YES)                                            
 	  250 Command CHGJOB  LOGCLPGM(*YES) successful.                               
 	> QUOTE RCMD  CALL TESTCL                                                      
 	  550-Error occurred on command CALL TESTCL.                                   
 	  550 TEST.                                                                    
 	> QUOTE RCMD DSPJOBLOG                                                         
 	  250 Command DSPJOBLOG successful.                                            
 	> QUOTE RCMD  CALL TESTCL                                                      
 	  550-Error occurred on command CALL TESTCL.                                   
 	  550 Function check. CPF1023 unmonitored by TESTCL at statement 200,          
 	   instruction X'000C'..                                                       
 	> QUOTE RCMD DSPJOBLOG                                                         
 	  250 Command DSPJOBLOG successful.                                            
 	Enter an FTP subcommand.                                               	        
 	===> 	                                                                          
                                                                                
                                                                                
                                                                                
 	F3=Exit     F6=Print       F9=Retrieve                                         
 	F17=Top    F18=Bottom    F21=CL command line                                   

FTPの実行環境

QTCPライブラリーの中のCLSを見てください。実行優先順位35、タイムスライシング2000、パージ*YESとなっています。対話型が実行優先順位20である点を除いては、省略値の対話型と同じ設定です。

バッチジョブ < FTPジョブ < 対話型ジョブ

の図式になります。気をつけてください。

 追加 2002-5-4

Default wait Timesecondsにも注意してください。クラスのなかの値です。QINTERと比較してみてください。

そうそう、カXボウのシステム関係って技術力は期待できないようですね。気をつけてください、偽者って、結構多いのがこの業界ですよね。

FTP版DSPJOB

実行されるFTPサブコマンドで、STATを入れておき、あとで、LOGを見ると、問題解決になることがあります。

FTPセッションからコマンド入力

対話型FTPで、デバッグ中、どうしても、そのまま、ライブラリーや、ファイルの中身を見たくて、システムコマンド(DSPPFMなど)を使いたくなったら、

SYSCMD CALL QCMD

を使います。この例でよくわかると思いますが、SYSCMDは、クライアント側(ローカル内)でのコマンド実行です。(QUOTE RCMDの逆です。)

タイムアウト

ところで、RCMDで、あまり長く実行されてしまうと、タイムアウトが起きます。てっきり、

QUOTE RCMD TIME 10000 10000

 とかで、一時指定変更できるのかと思うと、そうではなく、時間にあると、応答が無いので、セッションが終わってしまいます。すぐに終わるプログラムなら問題ありません。

上記の例で、

QUOTE RCMD CALL PGMA

* Time Out

GET file file

という状態で、GETまでいかない場合は、このPGMAのなかで、新たなFTPセッションを開き、今度は相手から、こちらに向けて、PUTする手があります。ややこしいのですが、

前提

このプログラムPGMAはあらかじめ同じものを、FTPクライアントのみならず、FTPサーバー側に作成済みであることが前提です。

この例では、

FTPクライアント: SYSAAA

FTPサーバー: SYSBBB, SYSCCC

となっており、3台のAS/400があることを前提とします。また、各マシンの上で作成されたデータは、SYSAAAに集積される前提です。

PGMA (SYSAAA)

PGM                                                                     
                                                                        
  DCL   &SYSNAME  *CHAR    8                                           
  DCL   &GPLNAME  *CHAR   10                                            
                                                                        
  MONMSG CPF0000                                                 

  RTVNETA  SYSNAME(&SYSNAME)                                            
                                                                        
       IF ( &SYSNAME = 'SYSAAA' ) CHGVAR  &GPLNAME  'AAALIB'            
  ELSE IF ( &SYSNAME = 'SYSBBB' ) CHGVAR  &GPLNAME  'BBBLIB'            
  ELSE IF ( &SYSNAME = 'SYSCCC' ) CHGVAR  &GPLNAME  'CCCLIB'            
                                                                        
  CHGCURLIB &GPLNAME                                                    
                                                                        
  CALL PGMB  /* 転送されるデータの作成 */  
                                                                        
IF ( &SYSNAME = 'SYSAAA' ) DO                                           
     RMVM           &GPLNAME/QFTPLOG  MBR( CKLSTP )                     
     OVRDBF INPUT   &GPLNAME/QFTPSRC  MBR( CKLSTP )                     
     OVRDBF OUTPUT  &GPLNAME/QFTPLOG  MBR( CKLSTP )                     
     FTP    RMTSYS(SYSBBB)                                              
     DLTOVR *ALL                                                        
                                                                        
     RMVM           &GPLNAME/QFTPLOG  MBR( CKLSTP )                     
     OVRDBF INPUT   &GPLNAME/QFTPSRC  MBR( CKLSTP )                     
     OVRDBF OUTPUT  &GPLNAME/QFTPLOG  MBR( CKLSTP )                     
     FTP    RMTSYS(SYSCCC)                                              
     DLTOVR *ALL                                                        
ENDDO                                                                   
                                                                        
IF ( &SYSNAME = 'SYSBBB' ) DO                                           
     RMVM           &GPLNAME/QFTPLOG  MBR( CKLSTP )                     
     OVRDBF INPUT   &GPLNAME/QFTPSRC  MBR( CKLSTP )                     
     OVRDBF OUTPUT  &GPLNAME/QFTPLOG  MBR( CKLSTP )                     
     FTP    RMTSYS(SYSAAA)                                              
     DLTOVR *ALL                                                        
ENDDO                                                                   
                                                                        
IF ( &SYSNAME = 'SYSCCC' ) DO                                           
     RMVM           &GPLNAME/QFTPLOG  MBR( CKLSTP )                     
     OVRDBF INPUT   &GPLNAME/QFTPSRC  MBR( CKLSTP )                     
     OVRDBF OUTPUT  &GPLNAME/QFTPLOG  MBR( CKLSTP )                     
     FTP    RMTSYS(SYSAAA)                                              
     DLTOVR *ALL                                                        
ENDDO                                                                   
                                                                        
RETURN                                                                  
ENDPGM                                                                  

AAALIB/QFTPSRC.CKLSTP (SYSAAA内)

XXXXXXXXX PPPPPPPP 
STAT                                                                    
QUOTE RCMD CALL PGMA                                       
QUIT  

BBBLIB/QFTPSRC.CKLSTP (SYSBBB内)

XXXXXXXXX PPPPPPPP                                                      
BINARY                                
STAT                                                                    
PUT XXX/CHKLSTP  AAALIB/CHKLSTPN                                        
QUIT  

CCCLIB/QFTPSRC.CKLSTP (SYSCCC内)

XXXXXXXXX PPPPPPPP                                                      
BINARY                                                     
STAT                                                                    
PUT XXX/CHKLSTP  AAALIB/CHKLSTPS                                        
QUIT 

関連記事:19.14.バッチFTPサンプル

2002/2/24


[ Previous ] [ HOME ] [ Upper ] [ Next ]

You are at K's tips-n-kicks of AS/400

 

SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送