如何绕过外部进程的确认提示?

时间:2011-11-23 16:46:11

标签: perl groovy groovyshell

如何将此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()
}

3 个答案:

答案 0 :(得分:2)

直接翻译是:

'ssh mserver /bin/composer delete job=pserver#APPA@'.execute().withWriter { writer ->
    writer.print('y\n' * 1500)
}

答案 1 :(得分:0)

另一种选择是使用yes

system( qq(ssh mserver "yes y | /bin/composer delete job=pserver#APPA\@") );

答案 2 :(得分:0)

标准的Unix程序yes是为这类事情而制作的。

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

请注意,yes会在有机会的情况下输出无限量。但是当与这样的管道一起使用时,它只比管道的另一端保持领先一步,等待它赶上读取,最后在OS给它一个SIGPIPE时退出。