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


99

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

$ process &

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



답변:


112

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

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

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

echo blah > /tmp/fifo


6
매우 인상적!
Samuel Edwin Ward

1
프로세스 stdout을 파일로 리디렉션하는 것과 비슷한 작업을 수행 할 수 있습니까?
rustyx

@rustyx : 테스트되지 않았지만 작동해야합니다. 파이프 대신 파일을 작성하십시오 touch /tmp/thefile. Stdout은 1이므로 call close (1); 또한 올바른 쓰기 권한을 사용하십시오 : call open ("/tmp/thefile", 0400). 는 echo…IS 물론, 필요하지 않습니다.
Ansgar Esztermann

대단해! 이것을 사용하여 완전히 분리 된 특정 프로세스에 "y"또는 "n"응답을 보냅니다. 분리 된 프로세스에는 별도의 창에 대한 표준 출력이 있습니다. 그러나이 트릭을 수행 할 때 'y'또는 'n'을 에코하자마자 "수신"하지 않는 것을 알 수 있습니다 .gdb를 종료하고 분리 한 다음 그에 따라 모든 에코를 수신해야합니다. 프로세스가 fifo에서 입력을 받기 전에 gdb를 종료 할 필요없이 이것을 수행하는 방법이 있습니까?
krb686

불행히도 그냥 매달린 것 같습니다 call open("/tmp/fifo", 0600). 어떤 도움이라도 대단히 감사하겠습니다
archer

27

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

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

거기에서 인용하십시오 :

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

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

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

용법

렙 티르 PID

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

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


12

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

를 사용하여 확인하십시오 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 를 사용할 수 있습니다 .


5
또는 dtach전체가 필요하지 않은 경우 screen.
manatwork

4
표준 (POSIX, SUS)에는 방법이 없지만 많은 (대부분의) 시스템에서는 디버거가 사용하는 메커니즘을 사용하는 것이 가능합니다. Ansgar의 답변을 참조하십시오 . 함께 root하면 심지어는 다른 사용자의 프로세스에이 작업을 수행 할 수 있습니다.
dmckee

3
이렇게 echo "test" > /dev/pts/1프로세스에 입력을 전송하지 않습니다 9947- 그것은 그 과정의 터미널에 출력 단어 "테스트"것이다.
psmears

6

편집 : 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을 프로세스 실행을 유지하는 방법에 대한 자세한 내용은.


2
그렇게 간단하지 않습니다. 예를 들어, stdin이 터미널에 연결된 경우 echo터미널 장치에 무언가를 입력하면 터미널에 쓴 내용 만 인쇄되므로 프로세스로 전송되지 않습니다.
Stéphane Gimenez

5

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

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

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


그리고 관련 질문은 여기에 있습니다 : unix.stackexchange.com/q/17648/9426
스테판 히메네스

@Rogach는 "이 터미널은 이제 오랫동안 문을 닫았습니다"라고 말했습니다.
andcoz

1
@andcoz : 그렇습니다. 그러나 그는 프로그램이 SIGHUP되지 않은 것에 대해 운이 좋았습니다. 더 안전한 방법을 제안하고있었습니다.
Stéphane Gimenez

내가 처음과 같은 표준 출력을 리디렉션하는 경우 여기를, 부인 만 진짜로 작동 >>/dev/stderr내가 터미널을 닫을 때 "부인"과정이 정말이 상점을 결코 이해할 수 없었다 .. 너무 끝날 것이다, 그렇지 않으면 ..
물병 파워
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.