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

Запись на стандартный ввод фонового процесса

Я нахожусь в коробке Ubuntu 10.04 и запустил сервер в фоновом режиме (myserver &) через ssh. Он работает нормально, но мне нужен способ получить доступ к stdin сервера, так как единственный способ управлять сервером - использовать этот метод.

Есть ли способ получить доступ к stdin уже запущенного процесса, чтобы я мог писать в него (и, надеюсь, прочитать его stdout)? Очевидно, если бы я собирался делать это сейчас, я бы начал с перенаправления FIFO на стандартный ввод, но, к сожалению, для этого уже немного поздно.

Любые идеи?

Вы можете запустить свой сервер с именованным каналом (fifo) на входе:

mkfifo /tmp/srv-input
cat > /tmp/srv-input &
echo $! > /tmp/srv-input-cat-pid
cat /tmp/srv-input | myserver &

В cat > /tmp/srv-input & важно, чтобы ваш сервер не получил EOF. По крайней мере, у одного процесса должен быть открыт FIFO в письменной форме, чтобы ваш сервер не получил EOF. PID этой команды сохраняется в /tmp/srv-input-cat-pid файл для последнего kill.

В вашем случае, когда вы уже запустили свой сервер, вам нужно использовать отладчик, такой как gdb присоединиться к вашему процессу, чтобы перенаправить его stdin на фифо:

gdb -p PID
call close(0)
call open(0, "/tmp/srv-input", 0600)

А затем сделайте что-то вроде ниже, чтобы отправить ввод на ваш сервер (при необходимости, в другом окне терминала):

echo "command" > /tmp/srv-input

Чтобы отправить EOF на ваш сервер, вам нужно убить cat > /tmp/srv-input процесс, PID которого был сохранен в /tmp/srv-input-cat-pid file.

В случае GDB просто выйдите из GDB, и будет отправлен EOF.

Вы можете попробовать записать его в каталог / proc pid. Скажите, что pid вашего демона - 2000, попробуйте написать в / proc / 2000 / fd / 0

То же, что и выше, но "кот" у меня не работал. Файл получил EOF и закончился после отправки одной команды.

Это сработало для меня:

#!/bin/bash

mkfifo /tmp/srv-input
tail -f /tmp/srv-input | myserver &