USBにドライブが接続されたら自動的にバックアップを作成したい

目次

目的

USB 接続のディスクドライブにバックアップを作成するシェルスクリプトbackup.shがあります。USB にディスクドライブが接続されたら、このスクリプトを自動的に実行するようにしてバックアップの手間を減らしたい。

環境

OS
Ubuntu 16.04

解決策

方針

Ubuntu 16.04 を含む最近の Linux は、デバイスの管理にudevを使用しています。そのため適当な rule ファイルを作成すると、デバイスが接続されたり取り外された時に決まったプログラムを実行させることができます。

そこでudevにドライブが USB に接続されたらバックアップ用のシェルスクリプトbackup.shを実行するルールを作成します。

ただしudevのルールから起動できるプログラムは、短時間で終了する必要があります。バックアップなど終了までに時間がかかるプログラムを実行させようとすると、途中で強制的に終了させられてしまいます。

この制限を回避するために、バックアプをsystemdのサービスとして、udevからはそのサービスを開始するようにします。

systemd サービス

まずバックアップを作成するサービスを定義します。

/etc/systemd/system/backup.service

[Unit]
Description=Backup to Removable USB Drive

[Service]
Type=simple
ExecStart=/root/bin/backup.sh

サービスを定義したら次のコマンドでsystemdに登録します。

# systemctl daemon-reload
# systemctl status backup
* backup.service
   Loaded: not-found (Reason: No such file or directory)
   Active: inactive (dead)

なおsystemdから起動されたプログラムの標準出力は、syslog に記録されると同時にsystemctl status SERVICE_NAMEで確認できます。

udev ルール

サービスを登録したら、そのサービスを起動するルールを作成します。

/etc/udev/rules.d/91-backup.rules

ACTION=="add",ENV{ID_BUS}=="ata",ENV{ID_PART_ENTRY_UUID}=="xxxx-xxxx-xxxx-xxxx",RUN+="/bin/systemctl --no-block start backup.service"

デバイスを識別するENVには、udevが認識している値を設定します。認識している値は、udevadm info --name=XXXコマンドで取得できます。

ルールを作成したら、次のコマンドでudevにルールを登録します。

# udevadm control --reload

これでxxxx-xxxx-xxxx-xxxxという UUID を持つディスクパーティションがataに接続されたらbackup.serviceが起動されます。

参照と脚注