Доступ к сопроцессу вне скрипта bash, который его создает

Поэтому я использую команду coproc в скрипте для запуска Java-программы и подачи входных данных в нее следующим образом:

#!/bin/bash

echo Script started.
coproc java -jar MultiThreadedFileProcessor.jar
echo start >&${COPROC[1]}
echo Script terminated.

Я хотел бы иметь возможность написать другой сценарий, который может передавать больше входных данных для этой программы (например, команда, которая скажет программе запускать процедуры завершения).

Есть ли способ, которым я могу получить доступ к stdin сопроцесса из другого сценария? Моя текущая попытка сценария завершения заключается в следующем:

#!/bin/bash

echo Script started.
echo terminate >&${COPROC[1]}
echo close >&${COPROC[1]}
echo Script terminated.

Это дает мне ambiguous redirect ошибка, однако, я предполагаю, потому что COPROC[1] определяется только в сценарии, который создает копрок.

Как еще, если вообще, я могу написать скрипт, который достигнет моей цели передачи строки в Java-программу?

0 ответов

COPROC - это локальный массив для первого скрипта - вы никогда не сможете получить к нему доступ из другого скрипта. В Linux вы можете получить доступ к /proc/$pid/fd/$n, где $ pid - это pid первого скрипта, а $ n - это fd, хранящийся в ${COPROC[1]}. Оба должны быть где-то переданы (файл pid и аналогично "файл fd"), но в этом случае вам может быть лучше создать именованный канал (mkfifo) и используйте это вместо создания сопроцесса. Примерно так (не проверенные) коды:

Скрипт 1:

mkfifo fifoname
exec 5>fifoname
java <fifoname &
echo close >&5

Скрипт 2:

exec 5>fifoname
echo terminate >&5
echo close >&5

Что closeкоманда должна делать? Программа java увидит

close
terminate
close

Имеет ли это смысл для программы java?

Другие вопросы по тегам