实时控制台输出(实时输出),而 运行 来自 Java 的 UNIX Shell 脚本
Real time console output (Live output) while running a UNIX Shell script from Java
要求是在 UI 上向用户显示脚本执行输出的实时流。
我有一个 UNIX Shell 脚本有多个命令,中间有 sleep 命令。从 Java 执行每个命令后,我需要读取控制台输出。
我正在使用 JSCH (JCraft) 连接到 UNIX 服务器和 运行 Shell 脚本。执行完整脚本后,我能够获得控制台输出。但是每次命令执行后都无法获取。
这是一个 UNIX Shell 脚本:
#!/bin/bash
echo "Executing touch ChaosMonkey"
sleep 5
echo "Connection and Execution Successfully"
if [ $? = 0 ]
then
echo "Monkey executed successfully"
else
echo "Monkey execution returned with error" $?
fi
P.S。我不能使用文件方法,我可以将 o/p 放入文件并通过其他 SSH 连接读取该文件。
这里是这个问题的解决方案:
这是 Java 代码 (JSCH) 的片段。在 while 循环中,您将收到实时控制台输出。
channel=session.openChannel("exec");
((ChannelExec)channel).setCommand("bash /tmp/temp.sh");
channel.setInputStream(null);
channel.setOutputStream(System.out);
InputStream out = channel.getInputStream();
channel.connect();
StringBuilder outputBuffer = new StringBuilder();
byte[] tmp = new byte[1024];
while (true) {
while (out.available() > 0) {
int i = out.read(tmp, 0, 1024);
if (i < 0)
break;
outputBuffer.append(new String(tmp, 0, i));
}
if (channel.isEOF()) {
break;
}
}
System.out.println(" console output::::::::::: "+ outputBuffer.toString());
System.out.println("Channel exit-status: " + channel.getExitStatus());
channel.disconnect();
要求是在 UI 上向用户显示脚本执行输出的实时流。
我有一个 UNIX Shell 脚本有多个命令,中间有 sleep 命令。从 Java 执行每个命令后,我需要读取控制台输出。
我正在使用 JSCH (JCraft) 连接到 UNIX 服务器和 运行 Shell 脚本。执行完整脚本后,我能够获得控制台输出。但是每次命令执行后都无法获取。
这是一个 UNIX Shell 脚本:
#!/bin/bash
echo "Executing touch ChaosMonkey"
sleep 5
echo "Connection and Execution Successfully"
if [ $? = 0 ]
then
echo "Monkey executed successfully"
else
echo "Monkey execution returned with error" $?
fi
P.S。我不能使用文件方法,我可以将 o/p 放入文件并通过其他 SSH 连接读取该文件。
这里是这个问题的解决方案:
这是 Java 代码 (JSCH) 的片段。在 while 循环中,您将收到实时控制台输出。
channel=session.openChannel("exec");
((ChannelExec)channel).setCommand("bash /tmp/temp.sh");
channel.setInputStream(null);
channel.setOutputStream(System.out);
InputStream out = channel.getInputStream();
channel.connect();
StringBuilder outputBuffer = new StringBuilder();
byte[] tmp = new byte[1024];
while (true) {
while (out.available() > 0) {
int i = out.read(tmp, 0, 1024);
if (i < 0)
break;
outputBuffer.append(new String(tmp, 0, i));
}
if (channel.isEOF()) {
break;
}
}
System.out.println(" console output::::::::::: "+ outputBuffer.toString());
System.out.println("Channel exit-status: " + channel.getExitStatus());
channel.disconnect();