Захватить STDIN / STDERR / STDOUT процесса ПОСЛЕ его запуска, используя командную строку? - PullRequest
8 голосов
/ 28 января 2012

Спасибо! Мой пользовательский регистр: я запустил длительный интерактивный процесс «настройки» (скажем, под «экраном»), а затем понял, что всегда должен отвечать «нет», пока не увижу конкретное ключевое слово. Кажется, это пустая трата времени, чтобы сделать это вручную (не говоря уже о том, что я легко могу пропустить ключевое слово ..)

Таким образом, похоже, я хочу передать (копию) STDERR / STDOUT в фильтр, а также быть в состоянии ввести в STDIN (консольный) процесс, ПОСЛЕ ТОГО, КАК оно было запущено, используя командную строку? Есть ли готовое решение?

Следующие инструменты кажутся полезными. Чтобы захватить вывод, используйте

strace -ewrite -p $PID

Это не так чисто (показывает такие строки, как: write (#,)), но работает! Но говорит ли он правильно обрабатывать UTF8?

Чтобы перенаправить вывод, сделайте что-то вроде

printf '..input..' >/dev/pts/33

Но не понятно, как найти подходящее устройство ..

Ответы [ 3 ]

6 голосов
/ 04 февраля 2012

Решено в Linux (очевидно, специфично для Linux):

reptyr -s PID 

присоединяет процесс к другому терминалу и / или отображает его ввод и вывод в виде каналов.

3 голосов
/ 29 января 2012

Это возможно, но это не красиво.Процесс выглядит следующим образом:

  1. используйте gdb для подключения к уже запущенному процессу
  2. run p close(<fd>) где <fd> - дескриптор файла, который вы хотите изменить
  3. запустите p creat("<path to file">, <perms>), чтобы отправить вывод закрытого fd куда-нибудь еще

См. Эта ссылка для получения более подробной информации

1 голос
/ 28 января 2012

Почему вы хотите это сделать ??

Это невозможно в портативном режиме Posix-ly! Возможно, open -ing псевдофайлы /proc/1234/fd/0 и /proc/1234/fd/1 и /proc/1234/fd/3 (для процесса 1234) могут быть безобразной возможностью! И даже это может не работать в некоторых случаях (например, для труб).

В частности, я считаю, что семантика SIGPIPE, отправленная процессу, если никто не читает канал, будет нарушена ...

И я не верю, что вы сможете сохранить псевдотермическое качество, например, стандартный вывод .

Так что, по сути, вам лучше найти другой способ достижения ваших общих целей, который вы явно не объяснили.

Если ваш сценарий использования представляет собой какой-то странный configure сценарий, вы можете перезапустить его и передать в него свой собственный сценарий (в оболочке, python, perl и т. Д.). Не теряйте времени, чтобы попытаться поймать существующий configure процесс, просто перезапустите его соответствующим образом.

Посмотрите также на команду screen (и как она реализована!)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...