私はLinuxクラスのラボに取り組んでおり、先生はSystemdについて教えてくれています。
このコマンドを使用して特定のデバイスがマウントされたときにスクリプトを開始するサービスを作成するには:mount /dev/xvdc1 /mnt/backup
私が試したこと
/mnt/backup
がマウントポイントであるかどうかを確認しました。 (教師はそれを受け入れません。厳密にイベント駆動である必要があります)mount /dev/xvdc1 /mnt/backup
私はこの問題に間違った方法で取り組んでいるのではないかと思います。これはラボの問題です。
「
/mnt/backup
がマウントされたらすぐに、rsyncを使用して/dev/xvdc1
からすべてのファイルをコピーするユニットファイルを作成します。」
私が知っていること:
/dev/xvdc1
になります/mnt/backup
になります/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
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
またはサービスと呼んだもの