手動で停止したサービスが正しく停止しない

手動で停止したサービスが正しく停止しない

誰かが接続しようとしたときに有効にする必要があるサーバーがあります。これを行うには、システムソケットとサービスを作成し、サーバー用のエージェントを構築してから始めました。ありがとうこのチュートリアルあまり難しくありません。

実行中のサーバーと通信するために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操作を実行して「無効」動作を引き起こす可能性があります。

ExecStartExecStopコマンドがゼロ状態で終了し、システムがサービスを非アクティブに登録するように中断されないことを確認する必要があります。

おすすめ記事