다음과 같은 최소한의 예를 가정하면이 질문, 다른 쉘 스크립트는 제외.
[Unit]
Description=Foo Service
After=network.target systemfoo.socket
Requires=systemfoo.socket
[Service]
Type=oneshot
ExecStart=/bin/bash /opt/foo/foo.sh
TimeoutStopSec=5
[Install]
WantedBy=multi-user.target
systemfoo.socket
[Unit]
Description=Foo Socket
[email protected]
[Socket]
ListenStream=127.0.0.1:7780
Accept=Yes
[Install]
WantedBy=sockets.target
/opt/foo/foo.sh
#!/bin/bash
while true; do
logger -t FOO "Connection received: $REMOTE_ADDR $REMOTE_PORT"
done
내가 연결할 때
nc 127.0.0.1 7780
스크립트가 올바르게 호출되었습니다. 하지만 CTRL-C를 눌러 종료하면 nc
스크립트가 영원히 실행됩니다.
소켓을 닫을 때 SIGTERM을 스크립트 프로세스에 보내는 메커니즘이 있습니까( nc
종료할 때 그렇게 한다고 가정합니다)?
답변1
아니요, 연결이 닫혀도 systemd는 서비스를 중지하지 않습니다.
이것이 불가능한 이유는 systemd가 수신 대기 중인 소켓에 대한 새 연결을 수락하면 해당 소켓을 연결을 처리하기 위해 시작된 서비스에 전달하고 더 이상 해당 연결에 대한 참조를 유지하지 않기 때문입니다.
클라이언트가 연결을 닫은 시기를 감지하려면 stdin에서 읽거나 폴링하여 닫혔는지 확인하여 서비스 자체에서 소켓을 확인해야 합니다.