私はLinuxコースの練習をしており、先生はSystemdについて教えています。
以下を使用して、特定のデバイスがインストールされたときにスクリプトを開始するサービスを作成するには: mount /dev/xvdc1 /mnt/backup
私が試したこと
- タイマーを使用して
/mnt/backup
マウントポイントであることを確認します。 (先生はそれを受け入れません。それは厳密にイベント中心でなければなりません) - .mount 単位を作成し、.service 単位に .mount 単位が必要になります。このアプローチは、コマンドの実行時にスクリプトを起動しません。
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
答え1
デバイスを起動する前に、ConditionPathExists =を使用してファイルの存在条件を確認してください。指定された絶対パス名がない場合、条件は失敗します。 ConditionPathExists =に渡された絶対パス名の前に感嘆符( "!")が付いていると、テストは無効になり、パスが存在しない場合にのみデバイスが起動します。
ConditionPathIsMountPoint = ConditionPathExists =に似ていますが、パスが存在し、マウントポイントであることを確認してください。
最も簡単な方法は次のようなものです。
ConditionPathIsMountPoint=/mnt/backup
あなた[Unit]
の側から。これは確認されませんが、どのバックアップの作成に関してユーザーは面倒ではないかもしれませんが、デバイスはここにインストールされます。
Restart=on-failure
サービスの開始を続行しなければならない場合があります。
より正確なアプローチは、udev
特定のデバイスがインストールされたときにサービスを開始するルールを作成することです。
まず、lsusbでデバイスを見つけます。 IDを書き留めます(例:0a81:0101)
sudoedit /etc/udev/rules.d/100-mount-videos.rules を介して /etc/udev/rules.d/ に新しい udev ルールファイルを作成し、次のように新しいルールを追加します。
ACTION=="追加",ATTRS{idVendor}=="0a81",ATTRS{idProduct}=="0101",RUN+="/home/your_username/bin/mount_videos.sh"
または、あなたが言う他のサービスRUN+=
に置き換えることができます。RUN+=/usr/bin/systemctl start backup.service