gpt4 book ai didi

java - bash 与 java 的子进程对话?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:25:33 24 4
gpt4 key购买 nike

我正在尝试制作一个 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=$!

但我在谷歌上找不到任何东西来帮助我使用 echo 或类似的东西来帮助这里

我在想管道可能会起作用,但我认为我必须将脚本的一大块移到另一个文件中才能使用管道,然后脚本中的 echo 命令似乎不再起作用,所以,我愿意接受任何想法,谢谢 vzybilly

编辑:(第二次输入此内容,抱歉,如果现在不是所有内容都有意义)在谷歌搜索和更深入地思考这个想法之后,我找到了一个更好的方式来提出这个问题。脚本(现在应称为主程序或主脚本)将与用户交互,并且根据用户告诉主程序的内容,它会告诉 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 次,通常需要服务器启动并运行几分钟才能使用命令(否则会变成垃圾),有时服务器当前可能永远不会有命令跑,或几天)。我可以在脚本中的终端中交谈时写入文件,这样主脚本就不会很难,但是处理程序脚本中会包含什么?

最终工作脚本:

运行.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 脚本。但理想的选择是将服务器实现为套接字服务器,以便您可以从任何地方连接。使用 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

运行:

  1. 创建一个空的 input.txt 文件(触摸 input.txt)
  2. 在一个终端窗口中运行 java-wrapper.pl
  3. 在另一个终端窗口中运行 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

关于java - bash 与 java 的子进程对话?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6468198/

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