起動時にsystemdサービスを起動してから別のsystemdサービスを起動するにはどうすればよいですか?


9

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

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

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

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

私がしたいのは、mountgdrive.service(サービス、または必要なもの)を作成して、check.mountスクリプトを自動的に起動し、それが十分でない場合は、sonarr.serviceとrader.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

そして、このようにビットでsonarr.serviceとレーダーr.service mountgdrive.serviceに追加されましたAfter=

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

[Service]
User=samsepioldoresh4ze
etcetc
....

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


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


1
私が正しく理解し、あなたがしたい場合sonarr.serviceradarr.service後に実行されるようにmountgdrive.service稼働しているのですか?
ダン

@ダン正確に!問題は、私が書いた方法は、それは明らかに、あるmountgdrive.service実行されますが、何も(それはドライブをマウントすることはありません)行わず、その後、sonarr.serviceおよびradarr.serviceUbuntuが実行されているため正常に実行mountgdrive.service
samsepioldoloresh4ze

1
.mountユニットを調べることもお勧めします。あなたmountgdrive.serviceがしているすべてがディレクトリまたは類似のものをマウントしているなら、あなたはそれを.mountサービスに変えることができるかもしれません。依存関係があるため、特に信頼性が高くなります。
ダン

回答:


26

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

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

  1. After=

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

  2. Wants=

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

  3. Requires=

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

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

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

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

[Unit]
Description=MountSmokeScreen
After=network.target
Before=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 sonarr.service radarr.service

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

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

systemctl edit sonarr.service

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

[Unit]
Wants=mountgdrive.service

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

編集:WantedByおよびRequiredByオプションは[Install]セクションの下でのみ使用できます。(@ヤンキーありがとう)


感謝Wants=WantedBy=、私は間違いなくそれらを使用します!ラップトップi.imgur.com/a3LE3G9.png
samsepioldoloresh4ze

1
スクリプトにエラーがあるようです。で終わる行から確認できますCan't open /.config/SmokeScreen/smokescreen.conf。多分あなたは「〜/ .config / ...」をyoruスクリプトに持っています。チルド(~)を完全パスに置き換える必要があります/home/you_user_name/.config/....(またはスクリプトへの相対パスを使用)
Dan

github.com/FourFingerLifeHug/SmokeScreen/blob/master/…-これはcheck.mountスクリプトなので、すべての$(HOME)と$(bindir)をフルパスで変更する必要がありますか?ありがとう!
samsepioldoloresh4ze

1
@ samsepioldoloresh4zeはい、$HOMEまだログインしているユーザーがいないため、起動時に使用できません。
ダン

セクションにある必要WantedBy=があり[Unit]ますか?入るしかないと思った[Install]
ヤンキー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.