네트워크 서비스에서 StandardIO를 사용하도록 systemd를 구성하는 방법 간단한 스크립트 변환

네트워크 서비스에서 StandardIO를 사용하도록 systemd를 구성하는 방법 간단한 스크립트 변환

TCP 포트 6666에서 수신 대기하는 네트워크 서비스로 bash 스크립트를 설정하려고 합니다. 그러나 시작 시 다음 오류로 인해 서비스가 실패합니다.

 heartbeat]# systemctl status heartbeat.service
● heartbeat.service - Service de collecte des signaux de vie
   Loaded: loaded (/etc/systemd/system/heartbeat.service; disabled; vendor preset: disabled)
   Active: failed (Result: resources)

mai 12 12:32:48 Chalet systemd[1]: heartbeat.service: Got more than one socket.
mai 12 12:32:48 Chalet systemd[1]: heartbeat.service: Failed to run 'start' task: Invalid argument
mai 12 12:32:48 Chalet systemd[1]: Failed to start Service de collecte des signaux de vie.
mai 12 12:32:48 Chalet systemd[1]: heartbeat.service: Unit entered failed state.
mai 12 12:32:48 Chalet systemd[1]: heartbeat.service: Failed with result 'resources'.
mai 12 12:33:18 Chalet systemd[1]: heartbeat.service: Got more than one socket.
mai 12 12:33:18 Chalet systemd[1]: heartbeat.service: Failed to run 'start' task: Invalid argument
mai 12 12:33:18 Chalet systemd[1]: Failed to start Service de collecte des signaux de vie.
mai 12 12:33:18 Chalet systemd[1]: heartbeat.service: Failed with result 'resources'.

"heartbeat.service: 여러 소켓이 있습니다"라는 메시지가 무엇을 의미하는지 이해가 되지 않습니다. 내가 어디에서 잘못되고 있는지 이해하도록 도와주실 수 있나요?

나는 다음과 같이 systemd를 구성합니다.

하트비트.소켓:

[Unit]
Description=Socket pour le demon heartbeat
PartOf=heartbeat.service

[Socket]
ListenStream=0.0.0.0:6666
Accept=true

[Install]
WantedBy=sockets.target

하트비트.서비스:

[Unit]
Description=Service de collecte des signaux de vie
After=network.target heartbeat.socket
Requires=heartbeat.socket

[Service]
Type=simple
ExecStart=/bin/bash /usr/heartbeat/heartbeat.bash
RemainAfterExit=no
StandardInput=socket
StandardOutput=inherit

[Install]
WantedBy=multi-user.target

/usr/heartbeat/heartbeat.bash는 다음과 같습니다.

 #!/bin/bash
while true
do
        read -r entree
        if [[ $entree == "frequence" ]]
        then
                echo "3600"
        fi
        if [[ -n $entree ]]
        then
                logger "heartbeat receveid : $entree"
        fi
done

답변1

heartbeat.service 이름 바꾸기[이메일 보호됨]작업이 완료되었습니다.

대답은 systemd.socket 맨페이지에 있습니다(한 번으로 충분하지 않으면 RTFM을 두 번...).

각 소켓 파일에는 소켓의 수신 트래픽에서 시작되는 서비스를 설명하는 일치하는 서비스 파일이 있어야 합니다(.service 파일에 대한 자세한 내용은 systemd.service(5) 참조). .service 단위의 이름은 기본적으로 .socket 단위와 동일한 이름으로 지정되지만 아래 설명된 Service= 옵션을 사용하여 변경할 수 있습니다. 아래 설명된 Accept= 옵션의 설정에 따라 이 .service 단위는 .socket 단위와 같이 이름을 지정해야 하지만 Service=로 재정의되지 않는 한 접미사를 대체해야 합니다. 또는 동일한 방식으로 이름이 지정된 템플릿 단위여야 합니다. 예: Accept=false가 설정된 경우 소켓 파일 foo.socket에는 일치하는 서비스 foo.service가 필요합니다.Accept=true로 설정된 경우 서비스 템플릿 파일[이메일 보호됨]들어오는 각 연결에 대해 서비스를 인스턴스화하려면 존재해야 합니다.

따라서 서비스는 systemd에 의해 인스턴스화되고 소켓 장치에 의해 트리거되므로 시작할 필요가 없습니다(수신 연결을 tcp 포트에서 수신하려면 서비스를 시작해야 함).

인스턴스 이름을 제공하지 않았기 때문에 서비스에서 %I로 지정된 인스턴스 이름이 궁금하신 분들을 위해 인스턴스 번호에서 1을 뺀 것으로 보입니다(즉, 첫 번째 인스턴스의 ID는 0입니다).

[root@Chalet ~]# systemctl status heartbeat.socket
● heartbeat.socket - Socket pour le demon heartbeat
   Loaded: loaded (/etc/systemd/system/heartbeat.socket; disabled; vendor preset: disabled)
   Active: active (listening) since Mon 2017-05-15 15:25:03 CEST; 7h ago
   Listen: 0.0.0.0:6666 (Stream)
 Accepted: 5; Connected: 5

mai 15 15:25:03 Chalet systemd[1]: Listening on Socket pour le demon heartbeat.
[root@Chalet ~]# ncat 127.0.0.1 6666              
what is %I in the service ?
^C
[root@Chalet ~]# systemctl status heartbeat.socket
● heartbeat.socket - Socket pour le demon heartbeat
   Loaded: loaded (/etc/systemd/system/heartbeat.socket; disabled; vendor preset: disabled)
   Active: active (listening) since Mon 2017-05-15 15:25:03 CEST; 7h ago
   Listen: 0.0.0.0:6666 (Stream)
 Accepted: 6; Connected: 6

mai 15 15:25:03 Chalet systemd[1]: Listening on Socket pour le demon heartbeat.
[root@Chalet ~]# journalctl -ra                   
-- Logs begin at Sat 2016-11-19 19:12:18 CET, end at Mon 2017-05-15 23:02:21 CEST. --
mai 15 23:02:21 Chalet root[7224]: heartbeat receveid : what is %I in the service ?
mai 15 23:01:43 Chalet systemd[1]: Started Service de collecte des signaux de vie pour 5 (127.0.0.1:50920).

관련 정보