다음과 같은 최소한의 예를 가정해 보겠습니다.이 문제, 다른 쉘 스크립트 외에.
[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
시스템 foo.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에서 읽거나 폴링하여 소켓이 닫혔는지 확인하는 방식으로 서비스 자체에서 소켓을 확인해야 합니다.