目的
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
が起動されます。
参照と脚注