システムソケットのアクティベーションが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/[Eメール保護] 気づく@。

[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)

関連情報