시스템 소켓 활성화 표준 입력

시스템 소켓 활성화 표준 입력

이전 xinetd 구성을 systemd로 전송해야 합니다. 요구 사항은 TCP 포트를 열고 들어오는 전송을 수신하는 것입니다. 응용프로그램은 파일을 포트에 네트워킹함으로써 연결당 하나의 파일을 전송할 수 있습니다. 전송이 등록되면 stdin을 파일로 리디렉션하여 들어오는 데이터를 파일에 저장하는 쉘 스크립트가 호출됩니다. 이 구조는 수년 동안 xined에서 작동해 왔습니다. 이것이 내가 가진 것입니다:

[root@localhost ~]# cat /etc/systemd/system/foo.socket
[Unit]
Description=Foo Socket
PartOf=foo.service

[Socket]
ListenStream=127.0.0.1:9999
Accept=yes

[Install]
WantedBy=sockets.target
[root@localhost ~]# cat /etc/systemd/system/[email protected]
[Unit]
Description=Foo Service
After=network.target foo.socket
Requires=foo.socket

[Service]
Type=simple
ExecStart=/usr/local/bin/foo.sh
TimeoutStopSec=5

[Install]
WantedBy=default.target
[root@localhost ~]# cat /usr/local/bin/foo.sh
#!/bin/bash

cat > /tmp/foo.$$
[root@localhost ~]# systemctl start foo.socket
[root@localhost ~]# echo "Hello World" > testfile
[root@localhost ~]# socat -u FILE:testfile TCP:127.0.0.1:9999
[root@localhost ~]# ls -al /tmp/foo.*
-rw-r--r--. 1 root root 0 Nov  7 21:20 /tmp/foo.19820
[root@localhost ~]#

tcp 포트가 열리고 서비스가 호출되며 쉘 스크립트가 실행됩니다. 그러나 출력 파일 크기는 0입니다. 소켓을 중지하고 다음 명령을 사용하는 경우:

[root@localhost system]# systemctl stop foo.socket
[root@localhost system]# /usr/lib/systemd/systemd-activate -l 127.0.0.1:9999 -a /usr/local/bin/foo.sh &
[1] 19833
[root@localhost system]# Listening on 127.0.0.1:9999 as 3.
[root@localhost ~]# socat -u FILE:testfile TCP:127.0.0.1:9999
Communication attempt on fd 3.
Connection from 127.0.0.1:39924 to 127.0.0.1:9999
Spawned /usr/local/bin/foo.sh (/usr/local/bin/foo.sh) as PID 19840
[root@localhost ~]# Child 19840 died with code 0
[root@localhost ~]# ls -al /tmp/foo*
-rw-r--r--. 1 root root   12 Nov  7 21:26 /tmp/foo.19840
[root@localhost ~]# cat /tmp/foo.19840
Hello World
[root@localhost ~]#

예상대로 작동합니다. 내가 무엇을 놓치고 있나요?

답변1

알고 있었다. 서비스 단위 파일에는 소켓의 데이터를 수락하려면 StandardInput=socket 옵션이 필요합니다. 전체 파일은 다음과 같아야 합니다.

# cat /etc/systemd/system/[email protected] 
[Unit]
Description=Foo Service
After=network.target foo.socket
Requires=foo.socket

[Service]
Type=simple
ExecStart=/usr/local/bin/foo.sh
TimeoutStopSec=5
StandardInput=socket

[Install]
WantedBy=default.target

관련 정보