Systemd:デーモンサーバーに入力をパイピングしますか?

Systemd:デーモンサーバーに入力をパイピングしますか?

たとえば、bash端末で実行できるサーバーがあります。

java -jar spigot.jar

出力を標準出力(私の意見では)に送り、端末画面に印刷します。端末でサーバーを停止するには、単に「stop」コマンドをサーバーに送信すると、サーバーはシャットダウンを開始します(現在のデータの保存など)。

しかし、再起動するたびにサーバーを起動したり、開かれたプロセスに追加のbashターミナルがかかったりしたくないので、サーバーを自動的に実行するようにsystemdサービスを設定し、次を使用しようとしました。 .serviceファイル(実際にはどこでも)次の標準入力を取得します。

[Unit]
Description=Spigot Minecraft server daemon

[Service]
Restart=always
WorkingDirectory=*location where spigot.jar is*

StandardInput=tty
TTYPath=/dev/tty2

ExecStart=/usr/bin/java -jar spigot.jar
ExecStop=/bin/sh -c 'echo stop >/dev/tty2'

[Install]
WantedBy=multi-user.target

しかし、これがなぜ機能しないのか理解していません。私は/dev/tty2をサーバーにパイプすることで、次のコマンドを使用するとき

systemctl stop *service*

サーバーに「stop」を送信する必要があります(/dev/tty2 を介して間接的に)。私は何を見逃していますか?

しかし、サービスが実行されていないようです。 StandardInput行とTTYPath行をコメントアウトすると、サーバーが起動しますが、発行時に

systemctl stop *service*

次に、サーバーログを確認します。

journalctl -u *service*

正しい終了順序が開始されません。プロセスは単に終了します(通常はそれ自体を停止するのではなく)。

だから私が知りたいのは、このサーバーをサービスとして実行し、いくつかのFIFO /ファイル/ tty /何でもパイプに接続するにはどうすればよいですか(それでサーバーコマンドを引き続き実行できますか?)。

ベストアンサー1

とても頑張っているようです。サービスを終了する標準的な方法は、SIGTERM信号(フォライト)またはSIGKILL信号(強制)を送信することです。私はこれが基本的なsystemd動作だと思います。したがって、ユニットファイルから次の行をすべて削除してみてくださいsystemd

StandardInput=tty
TTYPath=/dev/tty2
ExecStop=/bin/sh -c 'echo stop >/dev/tty2'

Spogit Webサイトには、SIGTERMとSIGKILLの使用に関する多くの参考資料があります。

おすすめ記事