web-dev-qa-db-ja.com

別のsystemdサービスが開始する前に、起動時にsystemdサービスを起動するにはどうすればよいですか?

古いHPラップトップでUbuntu 16.04を実行しています

小さな自家製プレックスサーバーを作成するために、いくつかのソフトウェアをインストールしました。ソナー、レーダー、大洪水、ジャケットなどをインストールしましたが、それらはすべて起動時に自動的に起動します!

数日前、私もrcloneをインストールすることに決め、スクリプトを起動することで各起動時にマウントする必要があるいくつかのフォルダーを作成しました(GitHubプロジェクトのおかげです)(ターミナル書き込みSudo ~/bin/check.mount)。 SonarrとRadarrは、大洪水を介して一時フォルダーにコンテンツをダウンロードし、マウントされたこれら2つのフォルダーのいずれかにエクスポートするように設定されています。

問題は、スクリプトを手動で起動するまでに、Sonarr/Radarrが既に起動して実行されていて、ルートフォルダーが見つからないため、エラーが発生することです。

私がやりたいのは、check.mountスクリプトを自動的に起動するためのmountgdrive.service(サービス、または必要なもの)を作成し、それが十分でない場合は、sonarr.serviceとradarr.serviceに遅延を挿入することです!それは可能ですか?

Sudo nano /etc/systemd/system/mountgdrive.serviceでこれを書いた

[Unit]
Description=MountSmokeScreen
After=network.target

[Service]
Type=oneshot
ExecStart=/home/samsepioldoloresh4ze/bin/check.mount
TimeoutStopSec=20
KillMode=process
Restart=on-failure

[Install]
WantedBy=multi-user.target

このように、mountgdrive.serviceビットのsonarr.serviceおよびradarr.service After=に追加しました

[Unit]
Description=Sonarr
After=syslog.target network.target mountgdrive.service

[Service]
User=samsepioldoresh4ze
etcetc
....

しかし、それは機能していません! SonarrとRadarrは正常に起動しますが、ドライブはマウントされていません!何が間違っていますか?


また、rtcwakeは私のラップトップでは動作しません-カーネルの問題だと思いますか?!それを修正する方法はありますか?

この問題が発生する理由は、After=またはRequires=も必要なときにWants=を使用しているためです。

依存関係を管理するための3つの主要なプロパティがあります。違いについて簡単に説明しますが、詳細は [Unit]セクションオプション| freedesktop.org で確認できます。

  1. After=

    このオプションはユニットの順序を設定するだけで、サービスの起動が完了したことを保証するものではありません。

  2. Wants=

    このオプションを使用すると、別のユニットの起動が完了した後にのみユニットを起動できます。 (正常に起動したかどうかは関係ありません)

  3. Requires=

    ただし、Wants=と同様に、これにより、依存関係が正常に開始された後にのみユニットが開始されます。

これらの各オプションの inverse を使用することもできます。

  1. After=Before=によって反転されます
  2. Wants=WantedBy=によって反転されます
  3. Requires=RequiredBy=によって反転されます

問題を解決するには、マウントサービスを次のように変更する必要があります。

[Unit]
Description=MountSmokeScreen
After=network.target
Before=sonarr.service radarr.service
WantedBy=sonarr.service radarr.service

[Service]
Type=oneshot
ExecStart=/home/samsepioldoloresh4ze/bin/check.mount
TimeoutStopSec=20
KillMode=process
Restart=on-failure

[Install]
WantedBy=multi-user.target

または、Wants=mountgdrive.servicesonarr.serviceおよびradarr.serviceユニットに追加できます。

以下を実行することで、デフォルトのファイルを変更せずにそれを行うことができます(radarr.serviceについても同じことをする必要があります):

systemctl edit sonarr.service

そして、以下を挿入します:

[Unit]
Wants=mountgdrive.service

注:Wants=が失敗した場合に2つのサービスをまったく開始したくない場合は、WantedBy=Requiresに、またはRequiredBy=mountgdrive.serviceに置き換えることができます(ただしWants=は通常十分であり、ドキュメントで推奨されています)。

22
Dan