bash说话的Java子进程?

我正在尝试制作一个bash脚本,该脚本将与通过bash等待我的命令的java程序对话. Java程序作为具有有限GUI的服务器运行,因此我正在为其创建一个基本UI来为其添加功能,有关此主题的任何帮助都将是不错的.

我目前尝试启动它的方式是:

INPUTFD=258
#exec "$INPUTFD"> >(exec java -Xmx512M -Xms512M -jar server.jar)

用这样的命令

(echo "kick ${user}") >&"$INPUTFD"

我现在正在使用的那个

java -Xmx512M -Xms512M -jar server.jar & echo "Started"

pid=$!

但我在Google上找不到任何可帮助我使用回声或类似功能的内容

我当时以为管道可以工作,但是我想我必须将脚本的很大一部分移到另一个文件中才能使用管道,然后我在脚本中的echo命令似乎不再想要工作,所以,我愿意接受任何想法,谢谢

编辑:(第二次输入此命令,对不起,如果不是现在所有的事情都有意义的话)在谷歌搜索并更深入地思考这个想法之后,我发现了一个更好的方法来提出这个问题.脚本(现在称为主程序或主脚本)将与用户进行交互,并且取决于用户告诉主程序的内容,它将告诉Java程序某些内容,某些情况下,它们是相同的当用户输入其他内容时,它将是用户对主程序所说的内容构成的主程序自己的东西.主程序将处理两个输出和一个输入(双向终端,而对Java程序则只有一种方式)

我认为一种可行的方式是在主脚本和Java程序之间有一个文件和另一个脚本,另一个脚本的名称应类似于server_handler.sh(我们将其称为处理程序脚本),其工作方式如下:主脚本执行如下命令:

server_handler.sh | java -jar server.jar

然后,当我们想从主脚本向服务器说些什么时,我们这样做:

echo "what we want to tell the sever" >> cmd.tmp

这样,处理程序脚本所做的就是从文件中读取并通过管道将其回显到Java程序,我遇到的问题是如何使处理程序脚本知道它已读取或删除了哪些行即使在读取文件时将其添加到文件,它也已读取? (某些命令将连续放置多达27次,通常需要花费几分钟的时间才能将服务器断开并运行,以使命令可用(否则将其删除),有时在当前服务器中可能永远没有命令运行,或持续数天).我可以在终端中使用脚本进行交谈时写入文件,因此主脚本不会很困难,但是处理程序脚本中会有什么?

最后的工作脚本:

run.sh:

#!/bin/bash
tail -f input.txt | java server.jar &
echo "Do Not Close This Window Or Press Enter Till Server Is Off Line,"
read -p "  Doing So Will Force Close The Server, Please press enter when done."

主脚本调用:

gnome-terminal -x ./run.sh

命令发布到服务器:

echo "command to server" >> input.txt

我尚未通过艰苦的考验,但它应该继续工作

解决方法:

一种方法是结合使用perl和shell脚本.但是理想的选择是将服务器实现为Socket服务器,以便您可以从任何地方进行连接.使用netcat命令,您甚至可以从Shell脚本向套接字服务器发送消息.

这是perl / shell脚本选项的示例. Java应用程序从可在运行时附加的文件input.txt获取输入.

EchoServer.java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class EchoServer {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String input = null;
        System.out.println("EchoServer started");
        while((input = reader.readLine()) != null) {
            System.out.println("Input: " + input);

            if("exit".equalsIgnoreCase(input)) {
                System.exit(0);
            }
        }
    }
}

Java应用程序的Perl包装器(java-wrapper.pl)

#!/usr/bin/perl -w
use strict;

open DATA, "java EchoServer | tail -f input.txt |"   or die "Couldn't execute program: $!";
while(my $line = <DATA>) {
  chomp($line);
  print "$line\n";
}
close DATA;

发送Java应用程序(shell.sh)输入的示例Shell程序

for i in 1 2 3 4 5 6;
do
  echo "sending $i" >> input.txt;
  sleep 1;
done

跑步:

>创建一个空的input.txt文件(触摸input.txt)
>在一个终端窗口中运行java-wrapper.pl
>在另一个终端窗口中运行shell.sh

输出:

$./java-wrapper.pl
sending 1
sending 2
sending 3
sending 4
sending 5
sending 6

编辑:
我只是意识到,您不需要PERL部分.你可以打电话,

java EchoServer | tail -f input.txt

从主脚本并使用echo附加input.txt

$java EchoServer | tail -f input.txt
sending 1
sending 2
sending 3
sending 4
sending 5
sending 6

编辑2:
如OP所述,正确的命令应为

tail -f input.txt | java EchoServer

$tail -f input.txt |java EchoServer
EchoServer started
Input: sending 1
Input: sending 2
Input: sending 3
Input: sending 4
Input: sending 5
Input: sending 5
上一篇:python-是否有一种方法可以从subprocess.Popen实例中读取字符,当它调用的进程尚未发出换行符时?


下一篇:python子流程:使用subprocess.PIPE时,输出顺序更改