0

このPerlコードをGroovyに変換するにはどうすればよいですか?

外部プロセスの確認プロンプトをバイパスするにはどうすればよいですか?

PerlスクリプトをGroovyに変換しようとしています。プログラムは、maestro(ジョブスケジューリング)ジョブを自動的にロード/削除しています。問題は、deleteコマンドが、検出したすべてのジョブで確認(Y / N)を求めるプロンプトを表示することです。プロセスをgroovyで実行しようとしましたが、プロンプトで停止します。Perlスクリプトは、ストリームにYの束を書き込み、停止を回避するためにハンドラーに出力します(私が正しく理解している場合)。Groovyで同じことを行う方法を知りたいですか?

または、コマンドを実行し、確認プロンプトごとにYを書き込む他のアプローチ。

Perlスクリプト:

 $maestrostring="";
 while ($x < 1500) {
    $maestrostring .= "y\n";
    $x++;
 }

  # delete the jobs
  open(MAESTRO_CMD, "|ssh mserver /bin/composer delete job=pserver#APPA@") 
  print MAESTRO_CMD $maestrostring;
  close(MAESTRO_CMD);

これは私の動作するGroovyコードです:

    def deleteMaestroJobs (){
            ...
    def commandSched ="ssh $maestro_server /bin/composer delete sched=$primary_server#$app_acronym$app_level@"
    def commandJobs  ="ssh $maestro_server /bin/composer delete job=$primary_server#$app_acronym$app_level@"

    try {
        executeCommand commandJobs
    }
    catch (Exception ex ){
        throw new Exception("Error executing the Maestro Composer [DELETE]")
    }

    try {
        executeCommand commandSched
    }
    catch (Exception ex ){
        throw new Exception("Error executing the Maestro Composer [DELETE]")
    }
}


    def executeCommand(command){
        def process = command.execute()
        process.withWriter { writer ->
          writer.print('y\n' * 1500)
        }
       process.consumeProcessOutput(System.out, System.err)
       process.waitFor()
}
4

3 に答える 3

2

直訳は次のようになります。

'ssh mserver /bin/composer delete job=pserver#APPA@'.execute().withWriter { writer ->
    writer.print('y\n' * 1500)
}
于 2011-11-23T17:05:59.450 に答える
0

他のオプションは使用することyesです:

system( qq(ssh mserver "yes y | /bin/composer delete job=pserver#APPA\@") );
于 2011-11-23T17:14:17.053 に答える
0

標準のUnixプログラムyesは、この種のもののために作られています。

yes | ssh mserver /bin/composer delete job=pserver#APPA@

yesチャンスがあれば無限に出力されることに注意してください。しかし、このようなパイプで使用すると、パイプのもう一方の端の1ステップ先に留まり、読み取りに追いつくのを待ち、OSがSIGPIPEを与えると最終的に終了します。

于 2011-11-23T17:14:44.980 に答える