wake-up-neo.com

분리 된 프로세스에 터미널을 어떻게 연결합니까?

다음과 같이 터미널에서 프로세스를 분리했습니다.

$ process &

이 터미널은 이제 오랫동안 폐쇄되었지만 process이 (가) 계속 실행 중이며 해당 프로세스의 stdin에 일부 명령을 보내려고합니다. 가능합니까?

107
Rogach

그렇습니다. 먼저 파이프를 만듭니다 : mkfifo /tmp/fifo. gdb를 사용하여 프로세스에 연결하십시오. gdb -p PID

그런 다음 stdin을 닫으십시오. call close (0); call open ("/tmp/fifo", 0600)

마지막으로 gdb가 중단 될 수 있으므로 다른 터미널에서 기록하십시오.

echo blah > /tmp/fifo

117
Ansgar Esztermann

원래 터미널에 더 이상 액세스 할 수없는 경우 ...

reptyr 원하는 것일 수 있습니다. https://serverfault.com/a/284795/187998

거기에서 인용하십시오 :

reptyr 를 살펴보십시오. 정확히 그렇게합니다. github 페이지는 모든 정보를 가지고 있습니다.

reptyr- "재검사"프로그램을위한 도구입니다.

reptyr는 기존의 실행중인 프로그램을 가져 와서 새 터미널에 연결하는 유틸리티입니다. ssh를 통해 장기 실행 프로세스를 시작했지만 중단하고 중단하고 싶지 않습니까? 화면을 시작하고 reptyr을 사용하여 화면을 잡고 ssh 세션을 종료하고 집으로 향하십시오.

용법

렙 티르 PID

"reptyr PID"는 id PID로 프로세스를 가져 와서 현재 터미널에 연결합니다.

연결 후 프로세스는 ^ C 및 ^ Z를 포함하여 새 터미널에서 입력을 받아 출력을 출력합니다. (안타깝게도, 백그라운드에서 백그라운드를 실행하더라도 이전 터미널에서 "bg"또는 "fg"를 실행해야합니다. 셸을 패치하지 않고는 합리적인 방법으로 고칠 수 없습니다.)

34
NiKiZe

나는 당신이 할 수 없다고 확신합니다.

ps x. 프로세스에 ? as 제어 tty , 더 이상 입력을 보낼 수 없습니다.

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

이 예에서는 입력을 9947echo "test" > /dev/pts/1. 다른 프로세스 (9942)에 연결할 수 없습니다.

다음에 screen 또는 tmux 를 사용하여이 상황을 피할 수 있습니다.

12
andcoz

[~ # ~] edit [~ # ~] : Stephane Gimenez가 말했듯이 그렇게 간단하지 않습니다. 다른 터미널로만 인쇄 할 수 있습니다.

/ proc를 사용하여이 프로세스에 쓰려고 시도 할 수 있습니다. / proc/ pid /fd/0에 있어야합니다.

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

해야합니다. 시도하지는 않았지만이 프로세스에 유효한 stdin 파일 설명자가있는 한 작동해야합니다. ls -l on / proc/ pid /fd /.

  • / dev/null =>에 대한 링크 인 경우 닫힙니다.
  • / dev/pts/X에 대한 링크이거나 소켓 =>이면 열려 있습니다.

프로세스를 계속 실행하는 방법에 대한 자세한 내용은 Nohup 을 참조하십시오.

6
Coren

&로 명령 행을 끝내면 프로세스가 완전히 분리되지 않고 백그라운드에서 실행됩니다. (zsh을 사용하면 &!를 사용하여 실제로 분리 할 수 ​​있습니다. 그렇지 않으면 나중에 disown해야합니다.

프로세스가 백그라운드에서 실행되면 더 이상 제어 터미널로부터 입력을받지 않습니다. 그러나 fg를 사용하여 포 그라운드로 다시 보내면 입력을 다시 읽습니다.

그렇지 않으면 디버깅 도구를 사용하지 않으면 ( Ansgar 's answer 참조하거나, retty 명령).

5
Stéphane Gimenez