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

Похож на него, принимает это [:space:] только появится в рамках выражения скобки (выделенные соответствия с *):

echo 'hello' | grep -E '^[:space:]*h'
*h*ello
echo 'hello' | grep -E '[^[:space:]]*h'
*h*ello
echo ' hello' | grep -E '^[[:space:]]*h'
* h*ello

Это объяснено следующим отрывком от man grep (мое выделение):

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

105
29.04.2019, 09:15
5 ответов

Да, это. Во-первых, создайте канал: mkfifo /tmp/fifo. Используйте gdb для присоединения к процессу: gdb -p PID

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

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

echo blah > /tmp/fifo

117
27.01.2020, 19:29
  • 1
    Очень впечатляющий! –  Samuel Edwin Ward 16.02.2012, 20:59
  • 2
    Я могу сделать что-то подобное для перенаправления процесса stdout в файл? –  rustyx 25.08.2014, 18:28
  • 3
    @rustyx: непротестированный, но это должно работать: создайте файл, а не канал, touch /tmp/thefile. Stdout равняется 1, таким образом, call close (1); также, используйте корректные полномочия для записи: call open ("/tmp/thefile", 0400). echo… конечно, не нужно. –  Ansgar Esztermann 26.08.2014, 14:25
  • 4
    Здорово! Я использую это для отправки "y" или "n" ответов на определенные процессы, которые были полностью отсоединены. Отдельный процесс имеет свой stdout к отдельному окну. Когда я делаю этот прием однако, я вижу, что он не "получает" 'y' или 'n', как только я повторяю его, я должен выйти из gdb и отсоединить его, и затем он получает все echos соответственно, так есть ли способ выполнить это, не будучи должен выйти из gdb, прежде чем процесс получит вход от FIFO? –  krb686 27.07.2015, 16:50

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

Проверьте использование ps x. Если процесс имеет a ? как управляющий 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 для предотвращения этой ситуации.

12
27.01.2020, 19:29
  • 1
    Или dtach если Вам не нужно целое screen. –  manatwork 16.02.2012, 15:32
  • 2
    Нет никакого пути в стандартах (POSIX, SUS), но на многих (большинство?) системы это - возможное использование механизмов то использование отладчиков. См. ответ Ansgar. С root Вы могли даже сделать это к процессам другого пользователя. –  dmckee --- ex-moderator kitten 16.02.2012, 23:30
  • 3
    Выполнение echo "test" > /dev/pts/1 не отправит вход для обработки 9947 - это произведет слово "тест" на терминале того процесса. –  psmears 21.11.2014, 00:59

РЕДАКТИРОВАНИЕ: Поскольку Stephane Gimenez сказал, дело не в этом простой. Это только позволяет Вам печатать к другому терминалу.

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

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

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

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

Дополнительную информацию см. в nohup о том, как поддерживать процессы в рабочем состоянии.

6
27.01.2020, 19:29
  • 1
    Дело не в этом простой. Например, Если stdin связан с терминалом, echoлуг что-то к оконечному устройству просто распечатает то, что Вы записали на терминале, он не будет передан к процессу. –  Stéphane Gimenez 16.02.2012, 18:16

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

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

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

5
27.01.2020, 19:29
  • 1
    И здесь существует связанный вопрос: unix.stackexchange.com/q/17648/9426 –  Stéphane Gimenez 16.02.2012, 18:04
  • 2
    @Rogach указал, "Что терминал теперь долго закрывается". –  andcoz 16.02.2012, 20:35
  • 3
    @andcoz: Да, но он был удачлив, что программа не была SIGHUPed. Я предлагал более безопасный метод. –  Stéphane Gimenez 17.02.2012, 13:25
  • 4
    здесь, отрицайте только действительно работы, если я сначала перенаправляю stdout как с >>/dev/stderr, иначе, когда я закрываю терминал, "отрицаемый" процесс закончится также.. Я никогда действительно понял этот tho.. –  Aquarius Power 20.11.2015, 07:08

Когда исходный терминал больше не доступен ...

reptyr может быть тем, что вам нужно, см. https://serverfault.com/a/284795/187998

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

Взгляните на reptyr , который делает именно это. На странице github есть вся информация.

reptyr - инструмент для "перепрограммирования" программ.

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

ИСПОЛЬЗОВАНИЕ

reptyr PID

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

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

Edit утверждает, что « reptyr не может захватить процесс, который имеет подпроцессы. Или подпроцесс (reptyr версии 0.6.2)». Ограниченная поддержка существует Проблема , Проблема

46
20.08.2021, 13:29

Теги

Похожие вопросы