web-dev-qa-db-ja.com

mountコマンドの後にsystemdサービスを開始する方法

私はLinuxクラスのラボに取り組んでおり、先生はSystemdについて教えてくれています。

このコマンドを使用して特定のデバイスがマウントされたときにスクリプトを開始するサービスを作成するには:mount /dev/xvdc1 /mnt/backup

私が試したこと

  1. タイマーを使用して、/mnt/backupがマウントポイントであるかどうかを確認しました。 (教師はそれを受け入れません。厳密にイベント駆動である必要があります)
  2. .mountユニットを作成し、.serviceユニットを作成するには、.mountユニットが必要です。このアプローチは、コマンドを実行するときにスクリプトを開始しませんでした:mount /dev/xvdc1 /mnt/backup

私はこの問題に間違った方法で取り組んでいるのではないかと思います。これはラボの問題です。

/mnt/backupがマウントされたらすぐに、rsyncを使用して/dev/xvdc1からすべてのファイルをコピーするユニットファイルを作成します。」

私が知っていること:

  1. マウントされるデバイスは常に/dev/xvdc1になります
  2. デバイスのマウントポイントは常に/mnt/backupになります
  3. マウントされている/dev/xvdc1に基づいてサービスを開始する必要があります

これが私の.serviceユニットファイルです

[Unit]
Description=Starts a backup for /dev/xvdc1 when mounted using the mount command.

[Service]
Type=simple
ExecStart=/root/backupscript.sh
ExecStop=/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target
6
Loligans

Systemdユニットの開始条件

ConditionPathExists =を使用すると、ユニットが開始される前にファイルの存在条件がチェックされます。指定した絶対パス名が存在しない場合、条件は失敗します。 ConditionPathExists =に渡される絶対パス名の前に感嘆符( "!")が付いている場合、テストは無効になり、パスが存在しない場合にのみユニットが開始されます。

ConditionPathIsMountPoint =はConditionPathExists =に似ていますが、特定のパスが存在し、マウントポイントであるかどうかを確認します。

最も簡単な方法は含めることです

ConditionPathIsMountPoint=/mnt/backup

あなたの[Unit] セクション。これはそこにマウントされているどのデバイスをチェックしませんが、バックアップを作成する場合、ユーザーはうるさくないかもしれません。

おそらくRestart=on-failureサービスの開始を引き続き試みます。


より正確な方法は、特定のデバイスがマウントされたときにサービスを開始するudevルールを記述することです。

参考

まず、lsusbでデバイスを見つけます。 IDをメモします(例:0a81:0101)

Sudoedit /etc/udev/rules.d/100-mount-videos.ruleを介して/etc/udev/rules.d/に新しいudevルールファイルを作成し、そこに次のように新しいルールを追加します。

ACTION == "add"、ATTRS {idVendor} == "0a81"、ATTRS {idProduct} == "0101"、RUN + = "/ home/your_username/bin/mount_videos.sh"

RUN+=RUN+=/usr/bin/systemctl start backup.serviceまたはサービスと呼んだもの

3
Centimane