StandardInput=소켓 서비스 실행 실패

StandardInput=소켓 서비스 실행 실패

서비스가 소켓의 표준 입력에 의존하는 간단한 소켓/서비스 쌍이 있습니다.

# /etc/systemd/system/simple.socket
[Unit]
Description=Simple socket

[Socket]
ListenStream=11111
# /etc/systemd/system/simple.service
[Unit]
Description=Simple service

[Service]
Type=simple
ExecStart=-cat -
StandardInput=socket
StandardOutput=socket

시작하려고 하면 다음과 같은 결과 netcat 127.0.0.1 11111가 나타납니다.

- simple.service - "Simple service"
     Loaded: loaded (/etc/systemd/system/simple.service; vendor preset: enabled)
     Active: failed (Result: start-limit-hit) since Tue 2020-05-19 09:42:17 CEST; 11min ago
TriggeredBy: simple.socket
    Process: 400879 ExecStart=/bin/cat - (code=exited, status=1/FAILURE)
   Main PID: 400879 (code=exited, status=1/FAILURE)

- simple.socket - "Simple socket"
     Loaded: loaded (/etc/systemd/system/simple.socket; static; vendor preset: enabled)
     Active: failed (Result: service-start-limit-hit) since Tue 2020-05-19 09:42:17 CEST; 11min ago
   Triggers: simple.service
     Listen: [::]:11111 (Stream)

제 생각에는 사용할 수 없는 연결 cat에 연결을 시도하기 때문에 시작되지 않는 것 같습니다 . 서비스 로 stdin교체하면 정상적으로 시작됩니다. 왜인지 이해가 안 돼요cat -sleep infinity

답변1

Accept=해결책은 소켓 옵션과 관련이 있습니다.

이 버전은 작동합니다:

# /etc/systemd/system/simple.socket
[Unit]
Description=Simple socket

[Socket]
Accept=yes
ListenStream=11111

새 파일 경로를 기록해 두십시오.

# /etc/systemd/system/[email protected]
[Unit]
Description=Simple service

[Service]
Type=simple
ExecStart=-cat -
StandardInput=socket
StandardOutput=socket

이제 nc 127.0.0.1 11111반환되지 않으므로 보내는 모든 내용을 에코할 수 있습니다. 이제 다음도 systemctl status simple*제공됩니다.

- simple.socket - Simple socket
     Loaded: loaded /etc/systemd/system/simple.socket; static: vendor preset: enabled)
     Active: active (listening) since Tue 2020-05-19 10:04:48 CEST; 48s ago
   Triggers: [email protected]:11111-127.0.0.1:47194.service
     Listen: [::]:11111 (Stream)
   Accepted: 2; Connected: 1;
      Tasks: 0 (limit: 9429)
     Memory: 120.0K
     CGroup: /system.slice/simple.socket

- [email protected]:11111-127.0.0.1:47194.service - "Simple service" (127.0.0.1:47194)
     Loaded: loaded /etc/systemd/system/[email protected]; static: vendor preset: enabled)
     Active: active (running) since Tue 2020-05-19 10:04:48 CEST; 48s ago
TriggeredBy: simple.socket
   Main PID: 403830 (cat)
      Tasks: 1 (limit: 9429)
     Memory: 184.0K
     CGroup: /system.slice/system-simple.slice/[email protected]:11111-127.0.0.1:47194.service
             -403830 /bin/cat -

나는 이것이 작동한다고 생각합니다. 당시 Accept=no각 연결은 동일한 프로세스에 연결을 시도하고 여러 소켓을 단일 표준 입력으로 다중화하려고 시도하는 것이 약간 이상하기 때문입니다. 각 Accept=yes연결은 새로운 프로세스를 생성하므로 소켓을 각 프로세스의 표준 입력으로 파이프하는 것은 간단합니다.

관련 정보