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

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

$ process &

그 터미널은 이제 오랫동안 폐쇄되었지만 process여전히 실행 중이며 해당 프로세스의 stdin에 명령을 보내고 싶습니다. 가능합니까?



답변

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

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

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

echo blah > /tmp/fifo


답변

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

reptyr당신이 원하는 것일 수도 있습니다, https://serverfault.com/a/284795/187998 참조

거기에서 인용하십시오 :

정확하게 reptyr을
살펴보십시오 . github 페이지에는 모든 정보가 있습니다.

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

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

용법

렙 티르 PID

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

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


답변

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

를 사용하여 확인하십시오 ps x. 프로세스가있는 경우 ?제어 청각 장애를 , 당신은 더 이상 그것을 입력을 보낼 수 없습니다.

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)에 접근 할 수 없습니다.

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


답변

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

/ proc을 사용하여이 프로세스에 쓰려고 시도 할 수 있습니다 . 그것은에 위치해야합니다 은 / proc / PID / FD / 0 , 그래서 간단한 :

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

해야합니다. 시도하지는 않았지만이 프로세스에 여전히 유효한 stdin 파일 설명자가 있는 한 작동해야합니다 . ls -lon / proc / pid / fd /로 확인할 수 있습니다 .

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

참조 nohup을 프로세스 실행을 유지하는 방법에 대한 자세한 내용은.


답변

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

프로세스가 백그라운드에서 실행되면 더 이상 제어 터미널로부터 입력을받지 않습니다. 그러나와 함께 전경으로 다시 보낼 수 있으며 fg입력을 다시 읽습니다.

그렇지 않으면 디버깅 도구를 사용하지 않는 한 (Stdin을 포함하여) 파일 설명자를 외부 적으로 변경하거나 손실 된 제어 터미널을 다시 연결할 수 없습니다 ( Ansgar의 답변 참조 또는 retty명령 참조).


답변