web-dev-qa-db-ja.com

systemdの「ソケットのアクティブ化」とxinetd

私はxinetdを使用し、それは私の目的のために機能します。しかし、最近、systemdに「ソケットアクティベーション」と呼ばれるものが組み込まれていることを発見しました。

これら2つは非常に似ているようですが、systemdは「公式」であり、より良い選択のようです。

しかし、それを使用する前に、それらは本当に同じですか?知っておくべき違いはありますか?

たとえば、Docker化されたサービスは、最初に要求されたときにのみ開始したいと思っています。私の最初の考えは、xinetdを使用することです。しかし、ソケットのアクティベーションはより良い/より速い/より安定している/何ですか?

6
lonix

Systemdソケットのアクティベーションを単独で考えると、xinetdアクティベーションよりもはるかに優れているとは思いません。後者も安定しており、より長く使用されています。ソケットのアクティブ化は、サービスの分離にとって非常に興味深いものです。通信が必要な場合でも、サービスを並行して開始でき、サービスを個別に再起動できます。

xinetdスタイルのアクティベーションをサポートするサービスがある場合、それをソケットアクティベーションで使用できます:a .socket description with Accept=truexinetdと同じように動作します。また、.serviceサービスを説明するファイル。 systemdソケットのアクティブ化の完全な利点には、サービスを提供するデーモンのサポートが必要です。 トピックに関するブログ投稿 を参照してください。

私のアドバイスは「壊れていない場合は修正しない」という傾向にありますが、xinetdベースのサービスをsystemdに変換したい場合は確かに実現可能です。

7
Stephen Kitt

ソケットのアクティブ化には、xinetdまたはsystemdのいずれかを使用できます。どちらでも機能します。すべてが1つのファイルにあるため、xinetdは個人的に使いやすいと思いますが、systemdも使用しています。これは、特にIPソケットだけでなく、複数のアドレスをリッスンし、UNIXソケットにソケットを転送する場合の柔軟性が高いためです。

ここでは例として、MySQLファイルソケットにTCP接続を転送するために使用しました。

/etc/systemd/system/mysql-proxy.service

[Unit]                                                  
Description=MySql Proxy Service
Requires=mysql-proxy.socket

[Service]
Environment=MYSQL_PROXY_TARGET=/var/run/mysql/mysql.sock
EnvironmentFile=-/etc/sysconfig/mysql-proxy
ExecStart=/usr/lib/systemd/systemd-socket-proxyd ${MYSQL_PROXY_TARGET}

/etc/systemd/system/mysql-proxy.socket

[Unit]                                                  
Description=MySql Proxy Socket

[Socket]
ListenStream=192.168.1.1:3306
ListenStream=192.168.2.1:3306
NoDelay=true
FreeBind=true

[Install]
WantedBy=sockets.target

従来の転送の必要性Accept=truesystemd対応プロセスは、1つのプロセスで複数の接続を処理するか、必要に応じて追加のプロセスをフォークすることになっています。

4
RalfFriedl