Я на Ubuntu 10.04 box и запустил сервер в фоновом режиме (myserver &) поверх ssh. Он работает нормально, но мне нужен способ получить доступ к стандартному серверу, так как единственный способ управлять сервером - это использовать этот метод.
Есть ли какой-нибудь способ добраться до stdin уже запущенного процесса, чтобы я мог написать ему (и, надеюсь, прочитать его stdout)? Очевидно, что если бы я собирался делать это сейчас, я бы начал с FIFO, перенаправляющего на stdin, но, к сожалению, сейчас уже немного поздно.
Любые идеи?
linux
bash
background-process
stdin
tajmorton
источник
источник
Ответы:
Вы можете попробовать записать в каталог / proc pid. Скажите, что pid вашего демона 2000, попробуйте написать в / proc / 2000 / fd / 0
источник
0
через2
набор в тот же файл, который обычно является виртуальным терминалом (что-то вроде/dev/pty/...
). Затем команда читает из FD0
и записывает в FD1
и2
связывается с виртуальным терминалом (например, через SSH или напрямую с вашим эмулятором терминала). Если какой-либо другой процесс обращается к этому файлу (например, через/proc
), происходит точно то же самое, то есть запись в него записывает в терминал, а не в команду.Вы можете запустить свой сервер с именованным каналом (fifo) в качестве ввода:
cat > /tmp/srv-input &
Важно , чтобы избежать сервера для получения EOF. По крайней мере один процесс должен иметь открытую записку fifo, чтобы ваш сервер не получал EOF. PID этой команды сохраняется в/tmp/srv-input-cat-pid
файле для последующего уничтожения.В вашем случае, когда вы уже запустили свой сервер, вы должны использовать отладчик, например,
gdb
для подключения к процессу, чтобы перенаправить егоstdin
на fifo:А затем сделайте что-то вроде ниже, чтобы отправить входные данные на ваш сервер (в другом окне терминала, если необходимо):
Чтобы отправить EOF на ваш сервер, вам нужно завершить
cat > /tmp/srv-input
процесс, в котором PID был сохранен/tmp/srv-input-cat-pid file
.В случае GDB просто выйдите из GDB, и EOF будет отправлен.
источник
mkfifo /tmp/srv-input; tail -f /tmp/srv-input | myserver &
? Это также будет держать трубу открытой ...tail
не работает, но добавил это, чтобы закончить работу:cat /tmp/srv-input | myserver; kill -9
cat / tmp / srv-input-cat-pid` && rm / tmp / srv-input-cat * `То же, что и выше, но «кошка» не работает для меня. Файл получил EOF и закончился после отправки одной команды.
Это сработало для меня:
источник