複数のアプリケーションを実行するためにシステムサービスを起動する最良の方法

複数のアプリケーションを実行するためにシステムサービスを起動する最良の方法

/usr/でスクリプトを呼び出すワンタイムサービスがあります。

これは私の.serviceファイルです。

[Unit]
Description = Start apps
After = network.target

[Service]
Type=simple
ExecStart=/usr/start_apps.sh

[Install]
WantedBy=multi-user.target

私のスクリプトは同様のことをします。

cd /home/user/apps
# Run apps one at a time in background
./app1 &
./app2 &

これでこのアプリケーションを実行しようとしているようですが、実行するとpgrep app何も実行されません。

それでサービスが終了したからだと思います。だから私は別のアプローチを試しました。

cd /home/user/apps
# Run app1 in back ground 
./app1 &
# Run app2 in forground so the service does not stop
./app2

これでこれが機能します(pgrepはアプリケーションが実行されていることを示しています)。ただし、サービスを開始すると決して返されません。 Ctrl+C を実行して bash プロンプトに戻り、アプリケーションはまだ実行中です。

私が望むのは、サービスを起動し、両方のアプリケーションを実行してからコマンドラインに戻って、次のことです。

systemctl start my-service.service

これを行う最良の方法は何ですか?

修正する次のようにサービスをインストールしています。

systemctl stop my-service.service
 ... copy the service/script files in place...
systemctl daemon-reload
systemctl enable my-service.service
systemctl start my-service.service

確かではありませんが…関連がありますか?

ベストアンサー1

バックグラウンドですべてのプロセスを開始すると機能しますが、特に重要である可能性があるため、Type=forkingより多くのオプションを使用する必要があります。RemainAfterExit=yes

rc.localこのユースケースは、次のようにsystemdによって処理されるスクリプト処理に似ています。このデバイスのテンプレートしたがって、次のオプションをすべて使用することをお勧めします。

[Service]
Type=forking
ExecStart=/usr/start_apps.sh
TimeoutSec=0
RemainAfterExit=yes
GuessMainPID=no

なぜブロックされ、フォアグラウンドの最後のプロセスでCtrl + Cを押すのかわかりません...systemctl startコマンド自体でCtrl + Cを押す必要がありますか?ちょっと変だと言いましょう…

このようにアプリケーションを起動することは(ほとんどのバックグラウンドで、スクリプトで)systemdの実際の目的ではなく、一部の機能を見逃す可能性があります。たとえば、systemctl stopまたはsystemctl restartそのデバイスではまったく機能しない可能性があります。

バックグラウンドでアプリケーションを実行することは最近「ハッキング」と見なされます(systemdだけでなく、多くの古いサービスマネージャと他のほとんどの最新のサービスマネージャも同様です)。systemdはまだこれを行うことができますが、これは主に以前のバージョンと互換性とより良い選択肢がある場合は使用できません。

私の提案は、アプリケーションごとに別々のサービスを作成したり、同じプロセスの複数のインスタンスを起動したい場合は、テンプレート単位を使用することです。また、正しい順序で開始および停止するように、デバイス間の依存関係を指定するディレクティブを調べます。特に、見てくださいPartOf=ディレクティブ:サービスセットを1つのユニットとして管理し、単一のコマンドを使用してサービスを開始、停止、または再起動できます。

おすすめ記事