이전 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