Разбираюсь с пайпами и файловыми дескрипторами. Возник вопрос в конкретной ситуации. Имеется php-скрипт read.php:
$step = 4 * 1024;
echo "php started\n";
while (!\feof(\STDIN)) {
\fwrite(\STDOUT, 'read stdin part: '.\fread(\STDIN, $step)."\n");
}
echo "php finished\n";
Хочу запустить его из баш-скрипта + отдельной строкой передать ему что-то в standard input следующим образом:
php read.php &
procId=$(ps axw -o pid,command | grep 'read' | head -1 | sed -r 's|^\s*([0-9]+)[^0-9]+.*$|\1|g')
echo "procId: $procId"
echo -e "test1\ntest2" >> /proc/$procId/fd/0
При этом php-скрипт не получает ничего в STDIN, вывод следующий:
$ sh box.sh
procId: 2818
$ php started
read stdin part:
php finished
При этом терминал висит, как будто ожидает ручного ввода данных. Делаю вывод, что вот эта строчка не срабатывает:
echo -e "test1\ntest2" >> /proc/$procId/fd/0
Судя по выводу в командную строку выше, у меня баш-скрипт завершает своё выполнение до начала исполнения php-скрипта («procId: 2818» вывелось раньше, чем «php started»). Как-то можно «дать понять» баш-скрипту подождать запуска php перед началом записи в его STDIN?