ターミナルを閉じた後でもソフトウェアを実行する

ターミナルを閉じた後でもソフトウェアを実行する

ターミナルで常に実行する必要があるサーバーをインストールしています。コマンドは次のようになります。

software server

今、私はこれをウィンドウを開いたままにせずにバックグラウンドで実行したいです。サービスを作成することを考えました。私のsoftware.serviceは次のようになります。

[Unit]
Description=Software Server

[Service]
Type=simple
ExecStart=/opt/software/bin/software server

ただし、すべてのサービスとガイドで ExecStop を定義する必要があります。サーバーが実際にサポートしていない場合、これをどのように実行すればよいでしょうか。停止時にプロセスを強制終了するだけでよいのでしょうか。

問題を解決する方法を教えてください(サービスである必要はありません)

答え1

https://www.freedesktop.org/software/systemd/man/systemd.service.html

関連部分、強調は私による:

実行停止=

ExecStart= で開始されたサービスを停止するために実行するコマンド。この引数は、上記の ExecStart= で説明したのと同じスキームに従って、複数のコマンド ラインを取ります。この設定の使用はオプションです。 このオプションで設定されたコマンドが実行されると、サービスが停止され、そのサービスに残っているプロセスは KillMode= 設定に従って終了されます (systemd.kill(5) を参照)。 このオプションを指定しない場合は、サービス停止が要求されたときに KillSignal= または RestartKillSignal= で指定されたシグナルを送信してプロセスを終了します。指定子と環境変数の置換がサポートされています ($MAINPID を含む、上記を参照)。

この設定では、サービスに終了を要求するだけのコマンド (たとえば、何らかの終了信号を送信する) を指定するだけでは十分ではなく、サービスが終了するまで待機しないことに注意してください。サービスの残りのプロセスは、コマンドが終了した直後に、上記のように KillMode= および KillSignal= または RestartKillSignal= に従って強制終了されるため、クリーンな停止にならない可能性があります。したがって、指定するコマンドは、非同期操作ではなく、同期操作にする必要があります。

そしてhttps://www.freedesktop.org/software/systemd/man/systemd.kill.html#次のように語っています。

デフォルトは SIGTERM です。

つまり、ExecStop を指定せずに実行した場合、systemctl stop software_serverSystemD は と同等のことを実行しますkill -15

関連情報