시간 초과 명령 및 파이프 - 우선 순위

시간 초과 명령 및 파이프 - 우선 순위

TCP 데이터 수신을 테스트해야 합니다. 나허용되지 않음iperf를 사용하세요.

요구 사항은 누군가가 임의의 데이터를 보낼 TCP 서버를 만들어야 한다는 것입니다. 수신된 바이트 수를 계산해야 합니다.

다음을 사용하라는 지시를 받았습니다.

timeout 60 cat < /dev/tcp/IP_addr/port | wc –c > byte_count-n.txt

이것이 그들이 생각하는 효과를 가져올까요? 60초 동안 데이터를 수신한 다음 시간 초과가 만료되면 수신된 데이터를 파이프하여 wc총계를 디스크 파일에 기록합니까?

프로그래머로서 이것을 보면 더 기쁠 것 같습니다.

(timeout 60 cat < /dev/tcp/IP_addr/port) | wc –c > byte_count-n.txt

그러나 분명히 쉘은 이것을 받아들이지 않을 것입니다. 내 우려가 맞나요?

Ash 쉘을 사용하고 있지만 Bash만 지원한다는 우려가 있습니다./dev/tcp

답변1

이 답변을 참고하세요질문의 이전 버전이 명령의 원래 의도는 다음과 같습니다.섬기는 사람.

아니요 bash(및 ksh이 기능의 소스) /dev/tcp/host/port는 다음을 위한 것입니다.고객TCP 연결.

쉘은연결하다호스트:포트로 연결하고 해당 연결의 소켓을 리디렉션 주제의 fd로 설정합니다. or 를 사용 <하면 <>fd 0(stdin), 을 사용하면 >fd >>1이 되지만 연산자는 차이가 없습니다. <특히 쉘을 사용한다고 해서 소켓의 전송 방향을 닫는 것은 아닙니다 . stdin은 여전히 ​​읽고 쓸 수 있는 소켓에 연결되어 있습니다.

(서버로서) 하나 이상의 연결을 수신하고 수락하려는 경우에는 사용할 수 없습니다 /dev/tcp/host/port.

내장 도구 와 같은 기본 제공 지원이 있는 셸과 같은 socat전용 도구를 사용해야 합니다 .nczshztcp

timeout 60 socat -u tcp-listen:12345,reuseaddr,bind=127.0.0.1,fork - | wc -c

루프백 IPv4 주소의 포트 12345를 수신하고 하위 프로세스에서 들어오는 연결을 수락하여 수신된 내용을 stdout(여기로 파이프됨 wc)에 기록합니다.

ncnetcat동일한 작업을 수행하는 데 일반적으로 사용할 수 있는 도구의 구현이 여러 개 있습니다 .

timeout 60 nc -l 127.0.0.1 12345 | wc -c

60초 동안 명령을 실행한다는 점에 유의하세요. 여기에는 들어오는 연결을 기다리면서 아무 작업도 하지 않는 시간이 포함됩니다.

들어오는 연결에서 타이머를 시작하려면 다음을 수행하십시오.

socat -u tcp-listen:12345,reuseaddr,bind=127.0.0.1 'EXEC:timeout 60 cat' | wc -c

여기서는 하나의 TCP 연결만 허용되고(no fork) ​​로 파이프됩니다 timeout 60 cat.

이 스레드에서 질문할 내용을 명확히 하기 위해 다음을 수행합니다.

 cmd1 | cmd2

실행 되지 않고 완료 cmd1되면 데이터가 로 전송되고 동시에 시작됩니다(병렬로 실행됨). 둘 사이에 파이프가 있습니다( cmd2의 stdout은 파이프의 쓰기 끝입니다. cmd2의 stdin은 읽기 끝입니다).cmd2cmd1cmd2cmd1

존재하다:

 timeout 60 nc -l 127.0.0.1 12345 | wc -c

이미 timeout병렬로 실행 중입니다 wc. timeout이를 실행할 다른 프로세스를 시작합니다 nc(동일한 표준 출력을 공유합니다).

timeout60 초 후,죽이다그 다른 과정. 이 시점에서 종료되지만 nc소켓에서 받은 내용을 파이프에 기록합니다( nc또는 socat출력을 버퍼링하지 않음). wc아직 읽지 않았 더라도 wc계속 읽는 것처럼 처리됩니다. 파이프가 배수됩니다.

(timeout 60 nc ...) | wc –c

동일할 것입니다. (code)서브쉘(ksh93 이외의 쉘에서 평가되는 서브쉘 프로세스)을 시작하는 것입니다 code. 그러나 여기서는 파이프라인의 일부이므로 코드가 이미 서브셸에 있어야 합니다(파이프라인의 서로 다른 부분은 동시에 실행되므로 서로 다른 프로세스에서 실행되어야 함).

관련 정보