Доступ к сопроцессу вне скрипта 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?