Я нахожусь в коробке 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 &