Назад | Перейти на главную страницу

Держите FIFO открытым с помощью сценария оболочки

Пытаюсь запускать процессы по скрипту, который может взаимодействовать.

РЕДАКТИРОВАТЬ: Общая проблема - запустить эти процессы через php. После того, как процесс запущен, другой php-скрипт (или тот же запущенный снова) должен прочитать вывод процесса. Затем третий php-скрипт запишет на вход процесса. Чтобы смоделировать запуск с помощью php, я использовал bash-скрипт, потому что он имеет те же проблемы.

Для этого я создаю исходящий файл, в который процесс может записывать данные, и файл, из которого процесс читает. Мой процесс, например, passwd.

Когда я пробую вот так:

mkfifo fifo.my
touch out.my
passwd > out.my 2> out.my < fifo.my & echo $!

это не работает. В соответствии с это сообщение EOF вызывает завершение passwd-Process.

Следуя решению упомянутой публикации, я попробовал

mkfifo fifo.my
touch out.my
cat > fifo.my &
passwd > out.my 2> out.my < fifo.my & echo $!

что создает две работы, за которыми я могу смотреть

jobs

Моя цель - запустить это через bash-скрипт

#!/bin/bash
cat > fifo.my & PID=$!
echo $PID

Когда я вызываю сценарий, создается процесс с PID = $ PID, но не задание. И, что гораздо важнее,

passwd > out.my 2> out.my < fifo.my & echo $!

не работает, потому что снова через канал отправляется EOF.

Как я могу оставить канал открытым из скрипта?

Я предлагаю использовать для этого библиотеку Tcl "expect", особенно для сценариев passwd; он выделяет псевдотерминал, который удаляет большинство неожиданностей и позволяет вам предпринимать действия на основе результатов.