Bash говорить с подпроцессом Java? - PullRequest
3 голосов
/ 24 июня 2011

Я пытаюсь создать bash-скрипт, который будет общаться с Java-программой, которая ожидает мои команды через bash.Java-программа работает как сервер с очень ограниченным графическим интерфейсом, поэтому я работаю над созданием базового пользовательского интерфейса, который добавит к нему функциональность, и любая помощь по этой теме была бы полезной.

я пытался запустить его в настоящее время:

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 или что-то в этом роде

Я думал, что труба может работать, но я думаю, что мне придется переместить большую часть скрипта в другой файл, чтобыиспользовать канал, который, как мне кажется, больше не работает с моими эхо-командами в скрипте, поэтому я открыт для любых идей, спасибо vzybilly

EDIT : (secondвремя набирать это, извините, если не все это имеет смысл сейчас) После Google и размышления над идеей я нашел лучший способ поставить вопрос.Скрипт (теперь должен называться основной программой или основным скриптом) будет взаимодействовать с пользователем, и в зависимости от того, что пользователь говорит основной программе, он сообщит 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

Мне еще предстоитпройти через жесткий тест, но он должен работать

Ответы [ 2 ]

2 голосов
/ 24 июня 2011

Один из способов сделать это - использовать комбинацию perl и shell-скриптов.Но идеальным вариантом было бы внедрить сервер в качестве Socket-сервера, чтобы вы могли подключаться из любого места.Используя команду netcat, вы даже можете отправить сообщение серверу сокетов из сценария оболочки.

Вот пример опции сценария 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);
            }
        }
    }
}

Perl-оболочка для Java-приложения(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)

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

Для запуска:

  1. Создать пустой файл input.txt (touch 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

из основного скрипта и добавить input.txt, используя echo

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

EDIT2: Как упоминалось в 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
2 голосов
/ 24 июня 2011

interesting_command_generating_script.sh | java net.vzybilly.MyCoolClass

Тогда интересующий_команд_генерирующий_скрипт (время от времени) (по своему усмотрению) записывает строки в свой стандартный вывод (например, echo).

Затем MyCoolClass будет читать изстандартный вход. Для этого можно использовать InputStreamReader .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...