あるシステムサービスは別のサービスに依存しています。

あるシステムサービスは別のサービスに依存しています。

単一のシステムサービス/プログラムを複数のプログラムとサービスにリファクタリングしようとしています。私の単一の大規模サービスは次のとおりです。

[Unit]
Description=Runs the App loop
After=network-online.target

[Service]
Type=simple
ExecStart=/usr/bin/python3 -u /App/mainLoop
WorkingDirectory=/App
StandardOutput=journal
Restart=on-failure

[Install]
WantedBy=multi-user.target

私はこれを別の例でまとめました。私が今欲しいのは2つのサービスです。

サービスA

[Unit]
Description=Initializes some things
After=network-online.target # Question 1

[Service]
Type=simple
ExecStart=/usr/bin/python3 -u /App/startup
WorkingDirectory=/App
StandardOutput=journal
Restart=on-failure # Question 2

[Install]
WantedBy=multi-user.target

サービスB

[Unit]
Description=Runs the App loop
After=network-online.target # Question 3

[Service]
Type=simple
ExecStart=/usr/bin/python3 -u /App/mainLoop
WorkingDirectory=/App
StandardOutput=journal
Restart=on-failure

[Install]
WantedBy=multi-user.target # Question 4

したがって、ここにはいくつかの問題点があります(上記の説明で引用)。

  1. このアクティビティにはネットワークが必要なくなりました。ここに何を入れるべきですか?可能なターゲットをどのように探しますか?
  2. 起動アプリケーションが起動時に一度だけ実行され、再度実行されないようにします。Restartフラグを別のものに変えなければならないようですが、なんですか?
  3. もちろん、サービスAが完了した後に実行したいと思います。ネットワーク以降ではなくゼロで終了し、ファイルに書き込むことができる場合にのみ実行されます。ワンタイムサービスAが正常に起動した後、どのように起動しますか?
  4. 3がもっと多いと思います。私はまだWantedBy目標と目標の間の区別をあいまいにしますAfter。基本的にWantedBy、それが属するグループ、そしてAfter後で連載されるべきグループは何ですか?

ベストアンサー1

  1. ターゲットはオペレーティングシステムによって異なり、ここにリストされていません。おそらくdefault.target。出力を見ると、目標と目的がわかります。systemctl list-dependencies
  2. 「再起動」を完全に削除します。
  3. 初期サービスはでなければなりませんType=oneshot。必要なファイルが記録されたかどうかによって、サービスは正しく終了します。ExecStartPre代わりに、起動初期化スクリプトを使用することもできます。
  4. WantedBysystemd指定された宛先に入ると、サービスの開始を指示します。Afterそのデバイスのすべてのデバイスが完了した後、指定されたターゲット(またはデバイス)を起動することを示します。

おすすめ記事