Bash Чтение Stdin из данного PID - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть вопрос относительно Linux в целом, хотя ответ на Bash будет оптимальным. Как можно прочитать stdin / stdout / stderr данного процесса (по PID) из скрипта? Другими словами, как я могу получить stdin / stdout / stderr другой программы из скрипта? Я пока не могу найти ответы в Интернете в другом месте.

Пока мне удалось найти идентификатор процесса

pidof {some-process-name}

И затем найдите местоположение его стандартного сокета (я думаю, это так и называется ...)

readlink -f /proc/{PID}/fd/0

Который обычно производит что-то вроде

/dev/pts/1

Тогда я смогу написать на этот стандартный

echo "Hello World" > /dev/pts/1

Однако попытка чтения из этого сокета

cat /dev/pts/1

Или из исходного файла

cat /proc/{PID}/fd/0

Оба ничего не производят, просто ожидая бесконечно, даже после того, как процесс завершен, и, таким образом, файл удален.

Любая помощь будет высоко ценится. Заранее спасибо!

UPDATE: Нашел способ решения проблемы, см. Мой ответ ниже.

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Хорошо, примерно через день экспериментов мне удалось это сделать. Поток чтения работает либо на /proc/{PID}/fd/0, либо на любом другом файле, на который ссылается этот файл (найден с readlink, как указано в моем вопросе). Readstream дает результат каждый раз, когда что-то вводится в стандартный ввод программы. Для моих тестов кажется, что это работает только для клавиатуры, а не для нажатий клавиш, грубо смоделированных с echo "Hello World" > /dev/pts/1 Тем не менее, этого достаточно для моих целей. Спасибо всем, кто указал мне правильное направление!

0 голосов
/ 06 ноября 2018

Вы не можете взаимодействовать с файловыми дескрипторами программы после ее запуска. Записи в /proc/$pid/fd/ просто сообщают вам, где связаны файловые дескрипторы - вы можете написать в место, которое подключено к stdout, и узнать, откуда он читает свой стандартный ввод, но не изменить то, к чему они подключены, или ввести новые данные в любой из этих потоков.

Обычный обходной путь для этого - запустить программу под инструментом, который включает эти операции (expect, tmux и т. Д.), Но, конечно, это должно произойти во время запуска программы.

...