다음과 같은소캇명령줄은 쉘 프롬프트에 입력하면 예상대로 작동합니다.
# /usr/bin/socat UDP-RECV:4321 STDOUT
UDP 포트 4321에서 수신 대기하고 수신하는 모든 것을 표준 출력에 씁니다.
다음은 수신된 데이터를 systemd 로그(서비스 표준 출력의 기본 대상)에 기록할 목적으로 이 명령을 systemd 서비스로 시작하려는 시도입니다.
# /etc/systemd/system/socat.service
[Service]
ExecStart=/usr/bin/socat UDP-RECV:4321 STDOUT
그러나 서비스가 시작되면 socat은 즉시 종료됩니다.
Process: 7425 ExecStart=/usr/bin/socat UDP-RECV:4321 STDOUT (code=exited, status=0/SUCCESS)
socat
run 을 사용하여 이 문제를 조사한 결과 -d -d -d -d
stdout에서 EOF가 발생하는 것으로 나타났습니다.
N starting data transfer loop with FDs [5,5] and [1,1]
N socket 2 (fd 1) is at EOF
I close(5)
N exiting with status 0
socat
시스템 서비스로 사용할 수 있나요 ?
답변1
문제는 socat
기본적으로 양방향으로 인해 발생합니다. 표준 입력을 읽으려고 시도하면 /dev/null
EOF를 받고 종료됩니다.
해결 방법은 다음 -u
옵션을 사용하는 것입니다.
ExecStart=/usr/bin/socat -u UDP-RECV:4321 STDOUT
UDP-RECV:4321
이는 socat에게 에서 까지 한 방향으로 실행하도록 지시합니다 STDOUT
.