다음과 같이 터미널에서 프로세스를 분리했습니다.
$ process &
그 터미널은 이제 오랫동안 폐쇄되었지만 process
여전히 실행 중이며 해당 프로세스의 stdin에 명령을 보내고 싶습니다. 가능합니까?
다음과 같이 터미널에서 프로세스를 분리했습니다.
$ process &
그 터미널은 이제 오랫동안 폐쇄되었지만 process
여전히 실행 중이며 해당 프로세스의 stdin에 명령을 보내고 싶습니다. 가능합니까?
답변:
그렇습니다. 먼저 파이프를 만듭니다 :
mkfifo /tmp/fifo
. gdb를 사용하여 프로세스에 연결하십시오.
gdb -p PID
그런 다음 stdin을 닫으십시오. call close (0)
; 다시 엽니 다.call open ("/tmp/fifo", 0600)
마지막으로 gdb가 중단 될 수 있으므로 다른 터미널에서 기록하십시오.
echo blah > /tmp/fifo
touch /tmp/thefile
. Stdout은 1이므로 call close (1)
; 또한 올바른 쓰기 권한을 사용하십시오 : call open ("/tmp/thefile", 0400)
. 는 echo…
IS 물론, 필요하지 않습니다.
call open("/tmp/fifo", 0600)
. 어떤 도움이라도 대단히 감사하겠습니다
원래 터미널에 더 이상 액세스 할 수없는 경우 ...
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
)에 접근 할 수 없습니다.
root
하면 심지어는 다른 사용자의 프로세스에이 작업을 수행 할 수 있습니다.
echo "test" > /dev/pts/1
프로세스에 입력을 전송하지 않습니다 9947
- 그것은 그 과정의 터미널에 출력 단어 "테스트"것이다.
편집 : Stephane Gimenez가 말했듯이 그렇게 간단하지 않습니다. 다른 터미널로만 인쇄 할 수 있습니다.
/ proc을 사용하여이 프로세스에 쓰려고 시도 할 수 있습니다 . 그것은에 위치해야합니다 은 / proc / PID / FD / 0 , 그래서 간단한 :
echo "hello" > /proc/PID/fd/0
해야합니다. 시도하지는 않았지만이 프로세스에 여전히 유효한 stdin 파일 설명자가 있는 한 작동해야합니다 . ls -l
on / proc / pid / fd /로 확인할 수 있습니다 .
참조 nohup을 프로세스 실행을 유지하는 방법에 대한 자세한 내용은.
echo
터미널 장치에 무언가를 입력하면 터미널에 쓴 내용 만 인쇄되므로 프로세스로 전송되지 않습니다.
명령 줄을 &
끝내면 프로세스가 완전히 분리되지 않고 백그라운드에서 실행됩니다. ( 실제로 분리하는 데 zsh
사용할 수 있습니다 &!
. 그렇지 않으면 disown
나중에 수행 할 수 있습니다 ).
프로세스가 백그라운드에서 실행되면 더 이상 제어 터미널로부터 입력을받지 않습니다. 그러나와 함께 전경으로 다시 보낼 수 있으며 fg
입력을 다시 읽습니다.
그렇지 않으면 디버깅 도구를 사용하지 않는 한 (Stdin을 포함하여) 파일 설명자를 외부 적으로 변경하거나 손실 된 제어 터미널을 다시 연결할 수 없습니다 ( Ansgar의 답변 참조 또는 retty
명령 참조).
>>/dev/stderr
내가 터미널을 닫을 때 "부인"과정이 정말이 상점을 결코 이해할 수 없었다 .. 너무 끝날 것이다, 그렇지 않으면 ..