Как подключить терминал к отсоединенному процессу?

Я отключил процесс от своего терминала, например:

$ process & 

Этот терминал уже давно закрыт, но процесс все еще запущен, и я хочу отправить некоторые команды на stdin этого процесса. Это возможно?

Да. Сначала создайте канал: mkfifo /tmp/fifo . Используйте gdb для присоединения к процессу: gdb -p PID

Затем закройте stdin: call close (0) ; и снова открыть его: call open ("/tmp/fifo", 0600)

Наконец, напишите (с другого терминала, поскольку gdb, вероятно, зависает):

echo blah > /tmp/fifo

Я совершенно уверен, что вы не можете.

Проверьте с помощью ps x . Если процесс имеет ? как управление tty , вы больше не можете отправлять ему вход.

 9942 ? S 0:00 tail -F /var/log/messages 9947 pts/1 S 0:00 tail -F /var/log/messages 

В этом примере вы можете отправить ввод 9947 выполняя что-то вроде echo "test" > /dev/pts/1 . Другой процесс ( 9942 ) недоступен.

В следующий раз вы можете использовать экран или tmux, чтобы избежать этой ситуации.

Я сам искал способ подключения существующего процесса к моему текущему терминалу в основном по той же причине (оригинальный терминал больше не был доступен).

repty может быть тем, что вы хотите, см. https://serverfault.com/a/284795/187998

Цитата оттуда:

Посмотрите на reptyr , что делает именно это. На странице github есть вся информация.

reptyr – инструмент для «повторного набора» программ.

reptyr – это утилита для запуска существующей запущенной программы и присоединения ее к новому терминалу. Начал длительный процесс по ssh, но должен уйти и не хочет его прерывать? Просто запустите экран, используйте reptyr, чтобы схватить его, а затем убейте сессию ssh и отправляйтесь домой.

ПРИМЕНЕНИЕ

reptyr PID

«reptyr PID» захватит процесс с идентификатором PID и привяжет его к вашему текущему терминалу.

После присоединения процесс будет принимать входные данные и записывать выходные данные на новый терминал, включая ^ C и ^ Z. (К сожалению, если вы воспользуетесь им, вам все равно придется запускать «bg» или «fg» в старом терминале. Это, вероятно, невозможно исправить разумным способом без исправления вашей оболочки.)

EDIT : Как сказал Стефан Гименес, все не так просто. Это позволяет печатать только на другом терминале.

Вы можете попытаться записать этот процесс с помощью / proc . Он должен быть расположен в / proc / pid / fd / 0 , поэтому простой:

 echo "hello" > /proc/PID/fd/0 

должен это сделать. Я не пробовал, но он должен работать, если этот процесс по-прежнему имеет действительный дескриптор файла stdin . Вы можете проверить это с помощью ls -l on / proc / pid / fd / .

  • если это ссылка на / dev / null =>, она закрыта
  • если это ссылка на / dev / pts / X или socket =>, она открыта

Дополнительную информацию о том, как сохранить процессы, см. В nohup .

Просто закончив командную строку & не полностью отделив процесс, он просто запустит ее в фоновом режиме. (С помощью zsh вы можете использовать &! Для фактического отсоединения, иначе вы disown позже).

Когда процесс выполняется в фоновом режиме, он больше не будет принимать входные данные от управляющего терминала. Но вы можете отправить его обратно на передний план с помощью fg после чего он снова прочитает ввод.

В противном случае внешнее изменение внешних файлов (в том числе stdin) невозможно, или повторно подключить потерянный управляющий терминал … если вы не используете инструменты отладки (см . Ответ Ansgar или посмотрите на команду retty ).