저는 최신 Ubuntu LTS를 실행하고 컴퓨터와 상호 작용하는 애플리케이션을 작성하고 있습니다. 기계에는 온도 제어를 위한 여러 센서와 여러 PID 루프가 있습니다. 데이터 입력 속도는 초당 약 20개 정도로 매우 빠릅니다. 테스트하는 동안 이들 각각에 별도의 스트림으로 액세스할 수 있기를 원합니다. 이렇게 하면 일부 터미널에서 진행 중인 모든 작업을 "주로" 볼 수 있도록 준비할 수 있습니다.
나의 현재 솔루션은 각 스트림에 파일을 제공하고 애플리케이션이 읽을 때 필요한 파일을 추가하도록 하는 것입니다. 그런 다음 "tail -f /tmp/Pressure.log"와 같은 명령을 입력하면 됩니다.
이것은 일회용 데이터이므로 현재는 /tmp에 넣어서 지울 수 있습니다. 그러나 이것은 쓰기가 너무 많아 파일 크기가 상당히 커질 수 있습니다. 이상적으로는 애플리케이션이 내가 하는 것처럼 추적할 수 있는 내용을 /dev에 기록하는 것입니다.
그렇다면 애플리케이션 스트리밍 텍스트를 별도의 프로세스에서 볼 수 있게 만드는 가장 좋은 방법은 무엇일까요? 이상적으로는 지원서에 가능한 한 적은 변경 사항을 적용하고 싶습니다. 다들 감사 해요!
답변1
데이터를 유지하지 않고 한 애플리케이션에서 다른 애플리케이션으로 스트리밍하는 일반적인 UNIX 방식은 파이프입니다. 셸에서:
data-producer | data-consumer
단일 생산자가 내보내고 단일 소비자가 수신하는 것보다 더 복잡한 패턴에 대해 항상 명명된 파이프를 사용할 수 있습니다.
# Set up the pipes
mkfifo /tmp/pressure.fifo
mkfifo /tmp/temperature.fifo
# Start the emiters
monitor-pressure >/tmp/pressure.fifo
monitor-temperature >/tmp/temperature.fifo
# Take input from multiple places
collect-and-analyse-all-data /tmp/pressure.fifo /tmp/temperature.fifo
이 경우 파이프(일반 이름이 없거나 이름이 지정됨)에는 몇 가지 단점이 있습니다.
- 생산자는 소비자가 실행 중이거나 데이터를 읽을 준비가 될 때까지 차단합니다. 그렇지 않으면 파이프가 데이터를 특정 지점까지 버퍼링한 다음 차단합니다. 데이터를 버퍼링하거나 프로세스를 차단하는 것보다 아무도 듣고 있지 않을 때 데이터 로거가 데이터를 삭제하는 것이 더 나을 수 있습니다. 귀하의 응용 프로그램에 따라 다릅니다.
- 소비자가 실행을 중지하거나 파이프를 닫으면 생산자는 파이프에 쓰려고 할 때 오류를 받게 됩니다. 이로 인해 순진한 프로그램이 중단됩니다. 오류를 무시하고 소비자가 파이프를 다시 열 때까지 계속 시도할 수 있지만(명명된 파이프에만 해당) 이를 달성하려면 더 많은 작업을 수행해야 합니다.
UNIX에는 다양한 IPC 메커니즘 세트가 있으며 다른 많은 메커니즘 중에서 선택할 수 있습니다.
- 무한히 늘어나는 임시 파일(지금 하고 있는 일과 비슷함)
- 데이터가 최신 데이터 항목으로 지속적으로 대체되는 임시 파일입니다. 간단하지만 소비자가 데이터 항목을 교체하기 전에 읽을 시간이 없는 경우 취약합니다.
- 임시 파일은 특정 크기로 증가한 다음 회전됩니다. 동기화가 제대로 작동하고 파일 회전 시 데이터 항목이 손실되지 않도록 하려면 생산자와 소비자 측에서 더 많은 작업을 구현해야 하지만 이는 좋은 절충안입니다.
- 공유 메모리
- 데이터그램 소켓.
- 등...
마지막 두 가지는 쉘 스크립트로 수행하기 어렵지만 마지막 것(데이터그램 소켓)은 최소한 가능하며 Python과 같은 프로그래밍 언어를 사용하면 더 쉬워질 것입니다.
조금 더 시간을 투자하고 Python(또는 Ruby 등)과 같은 언어에 대한 기본적인 네트워킹 기술을 갖고 싶다면 데이터그램 소켓(UNIX 또는 UDP)이 적합합니다. 데이터는 일시적이므로 메모리를 소비하지 않으며 생산자와 소비자 간의 통신 설정을 조정하기 위해 아무 것도 할 필요가 없습니다(올바른 포트에서 보내고 받기만 하면 됩니다). 따라서 둘 중 하나가 충돌하거나 가져오는 경우가 있습니다. 오류 재시작을 관리할 필요가 없으며 생산자와 소비자가 원격으로 있을 수도 있습니다. 유일한 단점은 사용하는 애플리케이션이 실행되지 않을 때 데이터가 버퍼링되는 대신 비트 버킷으로 들어간다는 것입니다.
다시 말하지만, 어떤 솔루션을 선택하느냐는 애플리케이션에 따라 달라집니다.
답변2
한 가지 옵션은 명명된 파이프를 사용하는 것입니다. 애플리케이션은 명명된 파이프에 쓸 수 있으며 현재 실행 중인 것과 동일한 방식으로 파이프를 모니터링할 수 있습니다. 파이프가 가득 찼을 때 프로그램 실행이 차단되지 않도록 파이프에 비차단 쓰기를 수행할 수 있습니다. 하지만 쓸 수 없는 데이터는 손실된다는 점에 유의하세요.
명명된 파이프 생성에 대한 자세한 내용은 "mkfifo"를 참조하세요. mkfifo(3)를 사용하여 프로그래밍 방식으로 이 작업을 수행하거나 mkfifo(1)을 사용하여 수동으로 수행할 수 있습니다.