나는 한동안 그것을 작동시키기 위해 노력해왔기 때문에 배관이 어떻게 작동하는지에 대한 근본적인 오해가 내 문제의 근본 원인이라고 생각합니다.
내 목표는 일부 원격 호스트에 대한 TCP 연결을 시작 netcat
하고 파일 시스템에 두 개의 명명된 파이프를 갖는 것입니다. 한 프로세스는 들어오는 데이터를 읽을 수 있고 다른 프로세스는 나가는 데이터로 쓸 수 있습니다. 현재 다음 구조를 사용하고 있습니다.
mkfifo in
mkfifo out
cat out | netcat foo.bar.org 4000 > in &
여기에서 다른 프로세스가 이 열린 TCP 연결을 읽고 쓸 수 있도록 허용하고 싶습니다. 이것이 "그냥 작동"해야 합니까, 아니면 이와 같은 구성이 작동하지 않는 이유가 있습니까?
무엇~인 것 같다현재 일어나고 있는 일은 out
문제 없이 읽을 수 있지만 쓸 때 in
파이프가 끊어졌다는 내용의 출력이 나오고 이후의 모든 통신이 중단된 것 같습니다. 아이디어?
(관련: 원래 사용했던 것:
netcat foo.bar.org 4000 < out > in &
그러나 입력 대기를 차단하는 것으로 나타났습니다. 저도 이것에 대해 궁금합니다. 하지만 별도의 질문으로 해결하는 것이 가장 좋습니다. )
답변1
cat out | netcat foo.bar.org 4000 > in &
문제는 cat
일단 파이프 EOF
에서 out
수신되면 종료된다는 것입니다. 종료 하면 cat
나머지 파이프라인( 포함 netcat
)도 종료됩니다.
다음과 같이 시도해 보세요.
while true; do cat out; done | netcat foo.bar.org 4000 > in &
따라서 cat
필요한 만큼 자주 다시 시작되고 파이프라인 EOF
에서 발생하는 모든 문제가 out
효율적으로 처리됩니다.
답변2
나는 또한이 문제에 직면했습니다. 주요 문제는 입니다 netcat
. 이는 훌륭한 도구이지만 입력 또는 출력 파일 설명자 중 하나가 닫힐 때 연결을 닫습니다. 서버가 수신 대기 중이 아닐 때는 아무 작업도 수행하지 않으며, 다른 피어가 다운되면 종료됩니다. 서버를 올바르게 설정하고 파일 설명자를 열어두기만 하면 작동합니다. 예를 들어, 다음 시나리오를 테스트했는데 완벽하게 작동했습니다. 터미널에 에코 서버 설정(저는 다음과 같이 설정했습니다):
mkfifo loopFF
netcat -t -l -p 4000 <loopFF | tee loopFF
이제 다른 터미널에서 fifo를 설정하여 서버에 연결하세요.
mkfifo in
mkfifo out
netcat 127.0.0.1 4000 <out >in &
서버가 보내는 모든 내용을 인쇄하고 계속 실행합니다. 애플리케이션이 in
종료될 때 한쪽 끝을 닫기 위해 애플리케이션에서 fifo를 사용하는 경우 netcat
연결을 닫습니다.
cat in &
그리고 같은 터미널에서:
cat > out
이제 입력한 내용이 다시 인쇄됩니다(Enter 키를 누른 후). 이 명령을 닫으면 연결도 닫힙니다.
답변3
Steven Monday의 분석은 나에게 좋아 보입니다. fifo는 cat
첫 번째 쓰기 후 반환 입니다 . 이를 방지하기 위한 해결책은 쓰기 모드에서 FIFO를 여는 프로세스(예: 아래 예의 첫 번째 프로세스)를 유지하는 것입니다.out
empty
cat
mkfifo in
mkfifo out
cat > out &
echo $! > out-pid
cat out | netcat foo.bar.org 4000 > in &
(out-pid 파일은 모든 것을 멈추게 합니다: kill -9 $(cat out-pid)
.)
다른 예시여기.