所以我使用perl脚本来调用命令,然后获取返回码:
my $command = "java myjar.jar ARG1 ARG2 ARG3 2>&1";
my $result = open2( *Reader, *Writer, $command ) or die "Could not open 2-way pipe: $!\n";
my $result_return_code = $?;
这似乎工作正常。但是,对于我的一项测试,它似乎没有用。我潜入了java代码,这就是打印的内容。
try {
...
}
catch (Exception e) {
System.out.println("Failed");
System.exit(99);
}
我没有收到99的错误代码,而是收到0的值。我现在尝试了dkatzel的编辑,并尝试将我的代码更改为以下内容:
my $command = "java myjar.jar ARG1 ARG2 ARG3 2>&1";
my $result = open2( *Reader, *Writer, $command ) or die "Could not open 2-way pipe: $!\n";
my $result_return_code = $? >> 8;
但是我仍然得到返回值0.这个更改也改变了我的其他测试用例之一,我得到的返回值为65280 ......现在它返回为255.
确定。现在我尝试了Zaid的编辑并且它有效。这是我的代码看起来像这样(还显示了比我之前更多的代码):
my $command = "java myjar.jar ARG1 ARG2 ARG3 2>&1";
my $result_pid = open2( *Reader, *Writer, $command ) or die "Could not open 2-way pipe: $!\n";
print Writer "stdinarg1=var1\n";
print Writer "stdinarg2=var2\n";
close(Writer);
my $result_string = <Reader>;
close(Reader);
waitpid($result_pid, 0);
my $result_return_code = $? >> 8;
my $result_return_code = $? >> 8;
答案 0 :(得分:4)
在Java中System.exit(X)
将返回代码设置为X并立即退出JVM。退出调用是在main方法中还是在其他任何地方都无关紧要。
根据perldoc $?
实际上是2个值:“高8位反映程序遇到的特定错误条件(程序的exit()值)。低8位反映模式失败“
所以将代码更改为:
my $result_return_code = $? >> 8;
可能会奏效。
修改强>
“此更改也改变了我的其他一个测试用例,其中我的返回值为65280 ......现在它返回为255”
是255也是-1,这可能是来自JVM的真正退出代码(在java代码中的某处查找System.exit(-1)
。65,000退出代码是因为位移$?
。 -1将$?
设置的所有位设置为高8位。
关于退出代码0:
假设该过程已经完成。退出代码0通常意味着成功。但是JVM在退出代码方面非常糟糕。如果代码没有显式调用System.exit()
,那么JVM将返回退出代码为0 即使例外是。因此,如果您获得的退出代码为0并且它确实应该是错误,则可能存在错误,Java代码中可能存在缺少对System.exit()的调用的错误;
答案 1 :(得分:3)
您需要等待子进程使用waitpid
返回。这是因为waitpid
设置$?
:
状态在
中返回$?
my $result = open2( *Reader, *Writer, $command )
or die "Could not open 2-way pipe: $!\n";
do { ... }; # Interact with the process
waitpid( $result, 0 );
my $result_return_code = $? >> 8;