시스템 소켓 활성화: 소켓을 닫을 때 bash 스크립트를 종료합니다.

시스템 소켓 활성화: 소켓을 닫을 때 bash 스크립트를 종료합니다.

다음과 같은 최소한의 예를 가정하면이 질문, 다른 쉘 스크립트는 제외.

[이메일 보호됨]:

[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에서 읽거나 폴링하여 닫혔는지 확인하여 서비스 자체에서 소켓을 확인해야 합니다.

관련 정보