サーバーを自動的に起動し、コマンドを渡すためにsystemdサービスをどのように設定する必要がありますか?

サーバーを自動的に起動し、コマンドを渡すためにsystemdサービスをどのように設定する必要がありますか?

ターゲット:

Fedoraでsystemdを使用して、コンピュータの起動時にMinecraftサーバーを実行しようとしています。サーバーを適切に管理するために満たす必要があるいくつかの独自の基準があります。

  1. minecraft私のホームディレクトリを使用して作成したシステムユーザーとして実行する必要があります/opt/minecraft。私はadduseringを渡してから行を追加しようとしましたUser=minecraftWorkingDirectory=/opt/minecraft/
  2. スケーラブルで、すべての数のサーバーで動作する必要があります。テンプレートサービスを使用して、ディレクトリを渡すように行をWorkingDirectory変更しました。WorkingDirectory=/opt/minecraft/%i
  3. 何らかの方法でコマンドを渡すことができるはずです。それが私が擁護することです。ソケットデバイスを試してから接続してみましたが、/run/minecraft%I正しく動作しません。 Minecraftサーバーを初めて使用する場合は、コマンドを渡すことができるインタラクティブコンソールがあります。以前はセッションtmux sendで駆動されるサーバーを使ってみましたが、tmux問題は自動的に起動せず、豪華な感じもしないという点です。

試すことができる解決策:

/usr/local/lib/systemd/system/[email protected]:

[Unit]
Description=Minecraft server: %i

# only run after networking is ready
After=network-online.target
Wants=network-online.target

[Service]
Type=simple

# restart if the server crashes
Restart=on-failure
RestartSec=5s

# set the input and outputs to a socket unit and the journal resp.
Sockets=minecraft@%i.socket
StandardInput=socket                     
StandardOutput=journal
StandardError=journal

# set the user and directory to the correct values
User=minecraft
WorkingDirectory=/opt/minecraft/%i/

# run the start script for the specified server
ExecStart=/bin/bash /opt/minecraft/%i/start.sh

[Install]
WantedBy=default.target

/usr/local/lib/systemd/system/[email protected]:

[Unit]
Description=Socket for Minecraft server: %i

[Socket]
# listen to a pipe for input
ListenFIFO=%t/minecraft%I.stdin

Service=minecraft@%i.service

質問:

サーバーを起動しようとするとsudo systemctl start minecraft@1_17_1.service(サーバーがインストールされている場合/opt/minecraft/1_17_1/)、失敗します。

Job for minecraft@1_17_1.service failed because of unavailable resources or another system error.
See "systemctl status minecraft@1_17_1.service" and "journalctl -xeu minecraft@1_17_1.service" for details.

これにより、以下を実行するように求められますsystemctl status minecraft@1_17_1.service

● minecraft@1_17_1.service - Minecraft server: 1_17_1
     Loaded: loaded (/usr/local/lib/systemd/system/[email protected]; enabled; vendor preset: disabled)
     Active: activating (auto-restart) (Result: resources) since Thu 2021-11-04 14:37:27 EDT; 163ms ago
TriggeredBy: × minecraft@1_17_1.socket
        CPU: 0

そしてjournalctl -xeu minecraft@1_17_1.service

Nov 04 14:51:01 riley-fedora systemd[1]: minecraft@1_17_1.service: Got no socket.
Nov 04 14:51:01 riley-fedora systemd[1]: minecraft@1_17_1.service: Failed to run 'start' task: Invalid argument
Nov 04 14:51:01 riley-fedora systemd[1]: minecraft@1_17_1.service: Failed with result 'resources'.
░░ Subject: Unit failed
░░ Defined-By: systemd
░░ Support: https://lists.freedesktop.org/mailman/listinfo/systemd-devel
░░ 
░░ The unit minecraft@1_17_1.service has entered the 'failed' state with result 'resources'.
Nov 04 14:51:01 riley-fedora systemd[1]: Failed to start Minecraft server: 1_17_1.
░░ Subject: A start job for unit minecraft@1_17_1.service has failed
░░ Defined-By: systemd
░░ Support: https://lists.freedesktop.org/mailman/listinfo/systemd-devel
░░ 
░░ A start job for unit minecraft@1_17_1.service has finished with a failure.
░░ 
░░ The job identifier is 55890 and the job result is failed.

私のファイルに怒っているようで、[email protected]次のことを実行しましたsystemctl status minecraft@1_17_1.socket

× minecraft@1_17_1.socket - Socket for Minecraft server: 1_17_1
     Loaded: loaded (/usr/local/lib/systemd/system/[email protected]; static)
     Active: failed (Result: resources)
   Triggers: ● minecraft@1_17_1.service
     Listen: /run/minecraft1_17_1.stdin (FIFO)

Nov 04 14:52:35 riley-fedora systemd[1]: minecraft@1_17_1.socket: Failed with result 'resources'.
Nov 04 14:52:35 riley-fedora systemd[1]: Failed to listen on Socket for Minecraft server: 1_17_1.
Nov 04 14:52:41 riley-fedora systemd[1]: minecraft@1_17_1.socket: Failed to open FIFO /run/minecraft1_17_1.stdin: Permission denied
Nov 04 14:52:41 riley-fedora systemd[1]: minecraft@1_17_1.socket: Failed to listen on sockets: Permission denied
Nov 04 14:52:41 riley-fedora systemd[1]: minecraft@1_17_1.socket: Failed with result 'resources'.
Nov 04 14:52:41 riley-fedora systemd[1]: Failed to listen on Socket for Minecraft server: 1_17_1.
Nov 04 14:52:46 riley-fedora systemd[1]: minecraft@1_17_1.socket: Failed to open FIFO /run/minecraft1_17_1.stdin: Permission denied
Nov 04 14:52:46 riley-fedora systemd[1]: minecraft@1_17_1.socket: Failed to listen on sockets: Permission denied
Nov 04 14:52:46 riley-fedora systemd[1]: minecraft@1_17_1.socket: Failed with result 'resources'.
Nov 04 14:52:46 riley-fedora systemd[1]: Failed to listen on Socket for Minecraft server: 1_17_1.

だから問題は私が使用しているパイプの権限に関連しているようです。

良い測定のために走ったjournalctl -xeu minecraft@1_17_1.socket

Nov 04 14:52:46 riley-fedora systemd[1]: minecraft@1_17_1.socket: Failed to open FIFO /run/minecraft1_17_1.stdin: Permission denied
Nov 04 14:52:46 riley-fedora systemd[1]: minecraft@1_17_1.socket: Failed to listen on sockets: Permission denied
Nov 04 14:52:46 riley-fedora systemd[1]: minecraft@1_17_1.socket: Failed with result 'resources'.
░░ Subject: Unit failed
░░ Defined-By: systemd
░░ Support: https://lists.freedesktop.org/mailman/listinfo/systemd-devel
░░ 
░░ The unit minecraft@1_17_1.socket has entered the 'failed' state with result 'resources'.
Nov 04 14:52:46 riley-fedora systemd[1]: Failed to listen on Socket for Minecraft server: 1_17_1.
░░ Subject: A start job for unit minecraft@1_17_1.socket has failed
░░ Defined-By: systemd
░░ Support: https://lists.freedesktop.org/mailman/listinfo/systemd-devel
░░ 
░░ A start job for unit minecraft@1_17_1.socket has finished with a failure.
░░ 
░░ The job identifier is 58598 and the job result is failed.

質問:

私は何が間違っていましたか? 4時間かかりました。パンツGoogleの2番目、3番目、4番目のページにも解決策はありません。私はここで迷っているので、すべての助けに感謝します。

ベストアンサー1

問題を再現できないため、完全な回答はできません。しかし、検証可能な最小限の例を構築しようとし、いくつかのトラブルシューティングのアイデアを考えました。

# /etc/systemd/system/[email protected]
[Service]
ExecStart=cat -
User=stew
Sockets=sockinst@%i.socket
StandardInput=socket
StandardOutput=journal
StandardError=journal
# /etc/systemd/system/[email protected]
[Socket]
ListenFIFO=%t/sockinst%I.stdin
Service=sockinst@%i.service

その後、実行すると動作します。

stew /etc/systemd/system $ systemctl start sockinst@1_1.service
stew /etc/systemd/system $ echo "Hello" > /run/sockinst1_1.stdin 
stew /etc/systemd/system $ systemctl status sockinst@1_1.{service,socket}
● sockinst@1_1.service - Testing instanced sockets 1_1
     Loaded: loaded (/etc/systemd/system/[email protected]; static)
     Active: active (running) since Fri 2021-11-05 10:35:41 CET; 37s ago
TriggeredBy: ● sockinst@1_1.socket

systemd[1]: Started Testing instanced sockets 1_1.
cat[11623]: Hello

● sockinst@1_1.socket - Socket for instance 1_1
     Loaded: loaded (/etc/systemd/system/[email protected]; static)
     Active: active (running) since Fri 2021-11-05 10:35:41 CET; 37s ago
   Triggers: ● sockinst@1_1.service
     Listen: /run/sockinst1_1.stdin (FIFO)

systemd[1]: Listening on Socket for instance 1_1.

ここで触れることができるいくつかのヒントは次のとおりです。

  1. これにより、systemctl stop minecraft@1_17_1.serviceパラレルソケットは停止しません。これは/run/minecraft1_17_1.stdin継続的に実行されることを意味します。実際、これはecho "hello" > /run/minecraft1_17_1.stdinサービスを開始します。サービスの問題を解決する場合、古いソケットがテストに影響を与える可能性があると思います。次の2つのオプションのいずれかを選択することをお勧めします。

    1. それを利用systemctl stop minecrat@1_17_1.{service,socket}して防ぎ、
    2. ソケットセクションPartOf=minecraft@%i.serviceに追加されました。[Unit]これによりサービスが停止すると自動的に停止します。
  2. あなたはを使用していますRestart=on-failure。これは最終結果には適していますが、初期失敗を隠すことができます。問題の解決中に一時的に削除してみてください。その後、失敗すると、失敗の元の理由を確認できます。私はサーバーの起動に正当な問題があるようですが、ソケットは最初のインスタンスにバインドされています。その後、再起動するたびにExecStart =を試す前に以前のソケットにバインドできないため、最初から失敗した理由はわかりません。サービスとソケットを必ず停止してから起動し、すぐに出力を確認してください。エラーメッセージが違っても驚かないでしょう。

  3. Minecraftサーバーにグラフィカルユーザーインターフェースがあると説明しました。これはオプションであり、突然あなたDISPLAYXAUTHORITYあなたが設定した内容によって異なります。これは壊れる可能性がある多くのものを引き起こします。サービス担当者に連絡して、初期障害の原因を取り除くようにnogui選択してください。本当にそのGUIが必要な場合は、start.shスクリプトで環境変数DISPLAYを設定する必要がありますXAUTHORITY(ただし、これが必ずしも最も簡単なことではありません)。サービスを実行できることを確認するには、少なくともGUIなしで試してみることをお勧めします。

  4. sudo systemctl daemon-reloadファイルの編集中に実行するのを忘れることもあります。注 systemd が各デバイスの最新バージョンを読み取れるように、このコマンドを実行する必要があります。

おすすめ記事