socat에 의해 생성된 가상 COM 포트의 주소(보통 /dev/pts/2 및 /dev/pts/3)가 필요합니다. 가끔 원래 주소에서 변경되기 때문에 이 주소가 필요합니다. 시스템을 다시 시작할 때마다 이 주소가 필요한 애플리케이션을 만들려고 하기 때문에 이 주소가 필요합니다.
나는 성공하지 않고 동일한 결과를 얻기 위해 다양한 방법을 시도했습니다.
socat -d -d pty,raw,echo=0 pty,raw,echo=0 2>&1| sed "2,3d"
출력을 주고 있다
2020/06/02 01:20:02 socat[24206] N PTY 는 /dev/pts/4
하지만
socat -d -d pty,raw,echo=0 pty,raw,echo=0 2>&1| sed '2,3d'|cut -d " " -f 7
출력 없음
2개의 COM 포트 주소를 2개의 변수에 저장한 다음 이를 내 애플리케이션에 전달해야 합니다. 여러분의 도움과 지원에 감사드립니다.
답변1
잘못된 문제(및 해결책)
질문에 설명된 문제는 라인 버퍼링 대신 블록 버퍼링으로 인해 발생합니다. 이는 명령 출력이 터미널이 아닐 때 성능을 최적화하기 위해 일부 명령에서 발생합니다. 명령에는 옵션이 있으며 이를 사용할 수 있습니다. 여기:sed -u
얻으려면 :
socat -d -d pty,raw,echo=0 pty,raw,echo=0 2>&1| sed -u '2,3d' |cut -d " " -f 7
아니면 다음과 같은 일반 도구를 사용할 수 있습니다.stdbuf
또는unbuffer
이런 일이 일어나지 않도록. 예를 들어 나중에 새 파이프를 추가하는 경우 다음을 cut
사용해야 할 수도 있습니다.
[...] | stdbuf -oL cut -d " " -f 7 | [...]
즉...실제 문제는 잊어버리세요. 디버그 출력을 구문 분석하는 것은 특정 목표를 달성하는 최선의 방법이 아닙니다. 예를 들어 내 버전은 라인 1과 2에 ptys를 출력합니다. 등이 socat
필요합니다 .sed -u 3d
실용적인 솔루션
실제로,socat
특정 문제를 해결하기 위한 옵션이 있습니다:
PTY
의사 터미널(pty)을 생성하고 해당 기본 터미널을 사용합니다.
[...]
유용한 옵션:협회,openpty,슬레이브 대기,모드,사용자,그룹
후에:
PTY 옵션 그룹
이러한 옵션은 pty 주소 유형과 함께 사용하기 위한 것입니다.
link=<filename>
실제 의사 터미널(pty)에 대한 심볼릭 링크를 생성합니다.이는 ptys 생성 이름이 다소 예측 불가능해지는 문제를 해결하는 데 도움이 될 수 있습니다., socat에서 자동으로 생성된 pty에 직접 액세스하기 어렵게 만듭니다. 이 옵션을 사용하면 사용자는 다음을 수행할 수 있습니다.실제 pty에 액세스하는 데 도움이 되도록 파일 계층 구조에서 "수정" 지점을 지정합니다(예).. socat 버전 1.4.3부터 주소가 닫힐 때 심볼릭 링크가 제거됩니다(그러나 unlink-close 옵션 참조).
내부에예부분:
socat PTY,link=$HOME/dev/vmodem0,rawer,wait-slave \ EXEC:"ssh modemserver.us.org socat - /dev/ttyS0,nonblock,rawer"
[...]
따라서 다음과 같이 문제를 해결할 수 있습니다.
socat pty,raw,echo=0,link=$HOME/socatpty1 pty,raw,echo=0,link=$HOME/socatpty2
예를 들어 다음을 생성합니다.
$ ls -l $HOME/socatpty[12]
lrwxrwxrwx. 1 user user 11 Jun 1 21:58 /home/user/socatpty1 -> /dev/pts/15
lrwxrwxrwx. 1 user user 11 Jun 1 21:58 /home/user/socatpty2 -> /dev/pts/16
socat
특히 링크가 끊어진 경우 나중에 또는 이전에 이러한 링크를 정리해야 할 수도 있습니다 .