
誰かが接続しようとしたときに有効にする必要があるサーバーがあります。これを行うには、システムソケットとサービスを作成し、サーバー用のエージェントを構築してから始めました。ありがとうこのチュートリアルあまり難しくありません。
実行中のサーバーと通信するためにFIFOパイプを作成し、アクティブなサーバーがない場合はサーバーを停止したいと思います。パイプを介してサーバーを停止すると、Server.service は一部のloaded deactivating stop
状態を維持し、Proxy.service は引き続き実行されます。 (状態systemctl list-units
:)
誰かが再接続しようとすると、サービスを再起動したいが手動で接続した場合にのみ機能しますsystemctl stop server.service
。
プロキシ、ソケット
[Socket]
ListenStream=25565
[Install]
WantedBy=sockets.target
プロキシサーバー
[Unit]
Requires=server.service
After=server.service
[Service]
ExecStart=/lib/systemd/systemd-socket-proxyd 127.0.0.1:25555
サーバー・サービス
[Unit]
Description=my Server
[Service]
User=nonRootUser
ExecStart=/home/nonRootUser/server/startup-fifo.sh
ExecStop=/home/nonRootUser/server/cmd stop
答え1
server.service
複数のType=simple
タイプ(指定されている場合はデフォルトExecStart=
)。
それについてExecStop=
興味深い話があります文書
ExecStop =で指定されたコマンドは、サービスが初めて正常に起動したときにのみ実行されます。サービスがまったく開始されていないか、起動が失敗した場合(例:ExecStart =、ExecStartPre =、またはExecStartPost =で指定されたコマンドが失敗したため)、呼び出されません(「-」プレフィックスが付いていません。参照)。上記)またはタイムアウトしました。また、サービスのプロセスが自ら終了または終了しても、サービスが正常に開始されると、常に停止操作が実行されます。この状況を処理するには、停止コマンドを準備する必要があります。
server.service
あなたの質問によると、FIFOを介して商品を送信するのではなく、「自己」を終了するように聞こえます。 systemdはこれを確認して呼び出して、ExecStop
保留中の追加のFIFO操作を実行して「無効」動作を引き起こす可能性があります。
ExecStart
ExecStop
コマンドがゼロ状態で終了し、システムがサービスを非アクティブに登録するように中断されないことを確認する必要があります。
答え2
見苦しいかもしれませんが、問題を解決しました。
Proxy.serviceの代わりにRequires=server.service
Proxy.serviceを作成しましたBindTo=server.service
。これにより、server.serviceが停止または失敗した場合にProxy.serviceが正しく終了します。
現在、server.serviceはloaded deactivating stop
何らかの理由で再起動できない状態で実行され続けています。スクリプトが完了すると、プロセスは失敗し、exit 1
server.serviceが状態に変わりますloaded failed failed
。
Proxy.serviceにはまだserver.serviceが必要なので、再起動し、すべてが期待どおりに機能します。