우분투 10.04 상자에 있고 ssh를 통해 백그라운드에서 서버 (myserver &)를 시작했습니다. 서버가 제대로 실행되고 있지만 서버를 제어하는 유일한 방법은이 방법을 사용하는 것이므로 서버의 표준에 도달하는 방법이 필요합니다.
이미 실행중인 프로세스의 표준에 도달 할 수있는 방법이 있습니까? 분명히, 지금이 작업을 수행하려면 FIFO를 stdin으로 리디렉션하여 시작하지만 불행히도 지금은 조금 늦었습니다.
어떤 아이디어?
우분투 10.04 상자에 있고 ssh를 통해 백그라운드에서 서버 (myserver &)를 시작했습니다. 서버가 제대로 실행되고 있지만 서버를 제어하는 유일한 방법은이 방법을 사용하는 것이므로 서버의 표준에 도달하는 방법이 필요합니다.
이미 실행중인 프로세스의 표준에 도달 할 수있는 방법이 있습니까? 분명히, 지금이 작업을 수행하려면 FIFO를 stdin으로 리디렉션하여 시작하지만 불행히도 지금은 조금 늦었습니다.
어떤 아이디어?
답변:
/ proc pid 디렉토리에 쓸 수 있습니다. 데몬의 pid가 2000이라고 가정하고 / proc / 2000 / fd / 0에 쓰십시오.
0
를 사용하여 명령을 시작합니다 . 이 명령은 다음 읽고 FD에서 와 기록 FD로 하고 (예를 들어, 터미널 에뮬레이터 SSH를 통해 또는 직접) 가상 터미널과 통신합니다. 다른 프로세스 (예를 통해 해당 파일에 액세스하는 경우 ) 정확히 같은 일이 발생, 즉 쓰기 그것에는 터미널이 아닌 명령에 기록합니다. 2
/dev/pty/...
0
1
2
/proc
명명 된 파이프 (fifo)를 입력으로 서버를 시작할 수 있습니다.
mkfifo /tmp/srv-input
cat > /tmp/srv-input &
echo $! > /tmp/srv-input-cat-pid
cat /tmp/srv-input | myserver &
cat > /tmp/srv-input &
서버가 EOF를받지 않도록 하는 것이 중요합니다. 서버가 EOF를받지 못하도록 최소한 하나의 프로세스에 fifo가 서면으로 열려 있어야합니다. 이 명령의 PID는 후행 종료를 위해 /tmp/srv-input-cat-pid
파일에 저장됩니다 .
서버를 이미 시작한 경우 gdb
프로세스에 연결하는 것과 같은 디버거를 사용하여 서버 stdin
를 fifo 로 리디렉션 해야합니다.
gdb -p PID
call close(0)
call open(0, "/tmp/srv-input", 0600)
그런 다음 다음과 같이 서버에 입력을 보내십시오 (필요한 경우 다른 터미널 창에서).
echo "command" > /tmp/srv-input
서버에 EOF를 보내려면에 cat > /tmp/srv-input
PID가 저장된 프로세스를 종료 해야 합니다 /tmp/srv-input-cat-pid file
.
GDB의 경우 GDB를 종료하면 EOF가 전송됩니다.
mkfifo /tmp/srv-input; tail -f /tmp/srv-input | myserver &
? 이렇게하면 파이프가 열린 상태로 유지됩니다.
tail
작동하지 않지만 작업을 완료하기 위해 이것을 추가했습니다 : cat /tmp/srv-input | myserver; kill -9
cat / tmp / srv-input-cat-pid` && rm / tmp / srv-input-cat *`