gpt4 book ai didi

java - 从 Java 调用的 Perl 脚本没有输出

转载 作者:行者123 更新时间:2023-12-02 01:22:09 25 4
gpt4 key购买 nike

我正在 Java 中使用 Ganymed ssh lib 连接到 Linux 机器并执行一些 unix 脚本,并显示它们的输出。

我正在运行一个父 shell 脚本,该脚本又运行一些其他子脚本,最后是一个 perl 脚本。对于 shell 脚本来说一切都运行良好,但是当它到达 perl 脚本时,我停止获得任何输出。

如果我在 Linux 服务器上手动运行父脚本,我会看到 Perl 的输出,没有任何问题

这是相关的java代码,连接到机器并调用shell脚本,并返回一个BufferedReader,从中可以逐行读取输出:

try {
conn = new Connection(server);
conn.connect();
boolean isAuthenticated = conn.authenticateWithPublicKey(user, keyfile, keyfilePass);
if (isAuthenticated == false) {
throw new IOException("Authentication failed.");
}
sess = conn.openSession();
if (param == null) {
sess.execCommand(". ./.bash_profile; cd $APP_HOME; ./parent_script.sh");
}
else {...}

InputStream stdout = new StreamGobbler(sess.getStdout());
reader = new BufferedReader(new InputStreamReader(stdout));

} catch (IOException e) {
e.printStackTrace();
}

我的父 shell 脚本看起来像这样:

./start1  #script1 output OK
./start2 #script2 output OK
./start3 #script3 output OK
/u01/app/perl_script.pl # NO OUTPUT HERE :(

有人知道为什么会发生这种情况吗?

编辑:添加 perl 脚本

#!/u01/app/repo/code/sh/perl.sh
use FindBin qw/ $Bin /;
use File::Basename qw/ dirname /;
use lib (dirname($Bin). "/pm" );
use Capture::Tiny qw/:all/;
use Data::Dumper;
use Archive::Zip;
use XML::Simple;
use MXA;
my $mx = new MXA;
chdir $mx->config->{$APP_HOME};
warn Dumper { targets => $mx->config->{RTBS} };
foreach my $target (keys %{ $mx->config->{RTBS}->{Targets} }) {
my $cfg = $mx->config->{RTBS}->{Targets}->{$target};
my @commands = (
[
...
],
[
'unzip',
'-o',
"$cfg->{ConfigName}.zip",
'Internal/AdapterConfig/Driver.xml'
],
[
'zip',
"$cfg->{ConfigName}.zip",
'Internal/AdapterConfig/Driver.xml'
],
[
'rm -rf Internal'
],
[
"rm -f $cfg->{ConfigName}.zip"
],
);
foreach my $cmnd (@commands) {
warn Dumper { command => $cmnd };
my ($stdout, $stderr, $status) = capture {
system(@{ $cmnd });
};
warn Dumper { stdout => $stdout,
stderr => $stderr,
status => $status };
}
=pod
warn "runnnig -scriptant /ANT_FILE:mxrt.RT_${target}argets_std.xml /ANT_TARGET:exportConfig -jopt:-DconfigName=Fixing -jopt:-DfileName=Fixing.zip');
($stdout, $stderr, $status) = capture {
system('./command.app', '-scriptant -parameters');
}
($stdout, $stderr, $status) = capture {
system('unzip Real-time.zip Internal/AdapterConfig/Driver.xml');
};
my $xml = XMLin('Internal/AdapterConfig/MDPDriver.xml');
print Dumper { xml => $xml };
[[ ${AREAS} == "pr" ]] && {
${PREFIX}/substitute_mdp_driver_parts Internal/AdapterConfig/Driver.xml 123 controller@mdp-a-n1,controller@mdp-a-n2
} || {
${PREFIX}/substitute_mdp_driver_parts Internal/AdapterConfig/Driver.xml z8pnOYpulGnWrR47y5UH0e96IU0OLadFdW/Bm controller@md-uat-n1,controller@md-uat-n2
}
zip Real-time.zip Internal/AdapterConfig/Driver.xml
rm -rf Internal
rm -f Real-time.zip
print $mx->Dump( stdout => $stdout,
stderr => $stderr,
status => $status );
=cut
}

最佳答案

生成输出的 Perl 代码部分是:

warn Dumper { stdout => $stdout,
stderr => $stderr,
status => $status };

查看the documentation for warn()我们看到:

Emits a warning, usually by printing it to STDERR

但是您的 Java 程序正在从 STDOUT 读取。

InputStream stdout = new StreamGobbler(sess.getStdout());

您有几个选择。

  1. 更改 Perl 代码以将输出发送到 STDOUT 而不是 STDERR。这可能很简单,只需将 warn() 更改为 print()
  2. 在shell脚本中调用Perl程序时,redirect STDERR to STDOUT .

    /u01/app/perl_script.pl 2>&1

我想您也可以将 Java 程序设置为从 STDERR 读取。但我不是 Java 程序员,因此我无法向您提供最佳方法的建议。

关于java - 从 Java 调用的 Perl 脚本没有输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57506084/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com