たとえば、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'