如何将此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()
}
答案 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时退出。