web-dev-qa-db-ja.com

fstabマウント後に実行するsystemdサービスを設定します

起動するはずのsystemd.serviceスクリプトを使用していますafter起動時に、CIFSネットワークの場所が/etc/fstabから/mnt/にマウントされます。

スクリプトはOpenVPN依存関係スクリプトが最初に起動するのを待ちますが、マウントが完了するのも待ちます。

/ etc/systemd/system/my-daemon.service

[Unit]
Description=Launch My Daemon
After=network.target vpn-launch.service
Requires=vpn-launch.service

systemd.mountAfter=network.target vpn-launch.service systemd.mountの行に追加しようとしましたが、期待した結果が得られませんでした。

36
Winterflags

cIFSネットワークの場所は、起動時に/etc/fstabから/mnt/を介してマウントされます。

いいえそうではありません。これを正しく行うと、残りは自然に整います。

マウントは、(生成された)systemdマウントユニットによって処理され、mnt-wibble.mountのような名前になります。実際の名前はsystemctl list-units --type=mountコマンドの出力で確認できます。 systemctl statusを使用する他のユニットと同じように、詳細に見ることができます。

非常に簡単に言えば、マウントユニットが起動した後にユニットを起動するように注文する必要があります。

After = network.target vpn-launch.service mnt-wibble.mount

参考文献

51
JdeBP

申し訳ありませんが、まだコメントできません。

JdeBPが言ったように、ファイルシステムマウントで注文する必要があります。マウントユニットの名前を予測するか、または(ユニットセクションで)使用できます。

RequiresMountsFor =/absolute/path/of/mount

このオプションは、適切な* .mountユニットへの依存関係を作成して、サービスを開始する前にパスにアクセスできるようにします。すべてのsystemdバージョンにあるとは限りませんが、CentOS 7マシンで過去6か月ほど使用しています。

17
miguelbernadi

どちらの答えも正しいですが、2セントをディスカッションに追加したいと思います。探していたので、いくつかの指示と続行方法の例がなかったためです。

  1. ファイルシステムを/etc/fstabに追加します
  2. mount -aと入力すると、fstabに記載されているすべてのファイルシステムがマウントされます。
  3. 以下で生成されたsystemdユニットを探します:

    systemctl list-units | grep '/path/to/mount' | awk '{ print $1 }'

    .mountで終わるものを返す必要があります)
  4. 見つかったマウントユニットをAfter=ファイルの*.serviceステートメントに追加します

ブート時にmy-daemonサービスを開始する例を次に示しますが、ネットワークの準備ができると、CIFS共有が/mnt/cifsにマウントされ、vpn-launchサービスが開始されます。

/ etc/fstab

//servername/sharename /mnt/cifs cifs defaults,some,other,options 0 0

注:fstabオプションにnofailを追加することもできます(たとえば、外付けドライブを使用する場合)。そうしないと、デバイスが接続されていないと、マシンは起動しません。 ArchWikiのfstab記事を参照してください


/ etc/systemd/system/my-daemon.service

[Unit]
Description=Launch My Daemon
Requires=vpn-launch.service mnt-cifs.mount
After=network.target vpn-launch.service mnt-cifs.mount

[Service]
ExecStart=/path/to/my-daemon

[Install]
WantedBy=multi-user.target

ブート時に開始されるようにサービスを有効にすることを忘れないでください:systemctl enable my-daemon

これは他のファイルシステム(NFS、HDDなど)でも機能することに注意してください。

すでに述べたように、どちらの答えも正しいので、すべての人に読むことをお勧めしますが、私にとっては、いくつかの例で時間を節約できたでしょう。

アップデート(2019-06-25):

  • 外付けドライブ使用時のブートロックを防ぐためのfstabオプションに関するメモを追加
  • mnt-cifs.mountRequires=リストに追加すると、cifsマウントが正常にマウントされなかった場合にmy-daemon.serviceが起動しなくなります。
16
bm-bergmotte

@ bm-bergmotte:私を大いに助けてくれたあなたの指示に感謝します。私にとっては、うまくいっています。

After=network.target vpn-launch.service mnt-cifs.mount
Requires=vpn-launch.service mnt-cifs.mount

「mnt-cifs.mount」を「必須」内に(この順序で)入れない場合、再起動/起動で機能しますが、デバイスがマウントされていない場合でもサービスは起動します。デバイスがマウントされていなかった場合は、サービスを追加する前に、 "" Requires "内にデバイスがマウントされます。

1
tmade