시스템 소켓 활성화가 bash 스크립트를 트리거합니다.

시스템 소켓 활성화가 bash 스크립트를 트리거합니다.

주기적으로 원격 bash 스크립트를 실행하고 싶습니다. 작동 방식은 타사 응용 프로그램이 특정 TCP 포트의 CentOS 7 시스템에 연결하고 짧은 문자 메시지를 보내는 것입니다. SSH는 타사 애플리케이션으로 인해 옵션이 아닙니다.

메시지를 받은 후 IP 주소를 bash 스크립트에 전달해야 합니다. bash 스크립트를 실행한 후 다음 메시지까지 잠자기를 원합니다. 나는 데몬을 쓰고 싶지 않습니다. 나는 이것을 간단하게 유지하고 싶습니다.

이러한 메시지는 일주일에 몇 번 이하로 나타날 수 있습니다. xinetd를 사용하여 실행하지만 systemd에서 작동하게 만드는 방법을 잘 모르겠습니다.

이것이 내가 지금까지 가지고 있는 것입니다:

/etc/systemd/systemfoo.service

[Unit]
Description=Foo Service
After=network.target foo.socket
Requires=foo.socket

[Service]
Type=oneshot
ExecStart=/bin/bash /opt/foo/foo.sh
TimeoutStopSec=5

[Install]
WantedBy=multi-user.target

/etc/systemd/systemfoo.socket

[Unit]
Description=Foo Socket
PartOf=foo.service

[Socket]
ListenStream=127.0.0.1:7780

[Install]
WantedBy=sockets.target

/opt/foo/foo.sh

#!/bin/bash

# Not sure how to get IP
logger -t FOO "Connection received:"
# Do some action

로그에서 본 내용은 다음과 같습니다.

Jul 10 17:29:32 localhost systemd: Listening on Foo Socket.
Jul 10 17:29:32 localhost systemd: Starting Foo Socket.
Jul 10 17:29:32 localhost systemd: Started Foo Service.
Jul 10 17:29:32 localhost systemd: Starting Foo Service...
Jul 10 17:29:32 localhost FOO: Connection received
Jul 10 17:29:53 localhost systemd: Started Session 4 of user vagrant.
Jul 10 17:29:53 localhost systemd-logind: New session 4 of user vagrant.
Jul 10 17:29:53 localhost systemd: Starting Session 4 of user vagrant.
Jul 10 17:29:56 localhost su: (to root) vagrant on pts/1
Jul 10 17:30:11 localhost systemd: Started Foo Service.
Jul 10 17:30:11 localhost systemd: Starting Foo Service...
Jul 10 17:30:11 localhost FOO: Connection received
Jul 10 17:30:11 localhost systemd: Started Foo Service.
Jul 10 17:30:11 localhost systemd: Starting Foo Service...
Jul 10 17:30:11 localhost FOO: Connection received
Jul 10 17:30:11 localhost systemd: Started Foo Service.
Jul 10 17:30:11 localhost systemd: Starting Foo Service...
Jul 10 17:30:11 localhost FOO: Connection received
Jul 10 17:30:11 localhost systemd: Started Foo Service.
Jul 10 17:30:11 localhost systemd: Starting Foo Service...
Jul 10 17:30:11 localhost FOO: Connection received
Jul 10 17:30:11 localhost systemd: Started Foo Service.
Jul 10 17:30:11 localhost systemd: Starting Foo Service...
Jul 10 17:30:11 localhost FOO: Connection received
Jul 10 17:30:11 localhost systemd: start request repeated too quickly for foo.service
Jul 10 17:30:11 localhost systemd: Failed to start Foo Service.
Jul 10 17:30:11 localhost systemd: Unit foo.socket entered failed state.
Jul 10 17:30:11 localhost systemd: Unit foo.service entered failed state.
Jul 10 17:30:11 localhost systemd: foo.service failed.

스크립트를 한 번 실행한 후 다음 메시지를 기다렸다가 다시 실행하도록 systemd를 얻는 방법에 대한 제안 사항이 있습니까?

테스트하기 위해 방금 실행했습니다.

echo "Hello" | nc 127.0.0.1 7780

업데이트된 작업 구성

/etc/systemd/[이메일 보호됨] 알아채다@.

[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

/etc/systemd/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

# Not sure how to get IP
logger -t FOO "Connection received: $REMOTE_ADDR $REMOTE_PORT"
# Do some action

구성을 systemd에 로드해야 합니다.

systemctl enable systemfoo.socket
systemctl start systemfoo.socket

답변1

각 연결에 대해 별도의 서비스 인스턴스를 시작해야 함을 systemd에 지시하기 위해 소켓 장치를 추가한 다음 서비스 장치를 각 연결에 대해 별도로 인스턴스화되는 Accept=yes템플릿( )으로 전환해야 합니다 . [email protected]그런 다음 맨페이지에 따라 및 환경 변수에서 원격 주소와 포트를 REMOTE_ADDR사용할 수 있어야 합니다.REMOTE_PORTsystemd.socket(5)

관련 정보