USB機器を挿した契機で、ちょっと時間のかかるプログラムをバックグラウンドで起動したい。
また、抜けたら抜けたで何か起動したい。
/etc/udev/rules.d/99-local-usb.rules
# USB機器が刺さったらなんかする ACTION=="add", SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", TAG+="systemd", ENV{SYSTEMD_WANTS}+="hoge@%E{DEVPATH}.service"
/etc/systemd/system/hoge@.service
[Unit] Description=HOGEHOGE service %I #After=network.target StopWhenUnneeded=true [Service] Type=oneshot ExecStart=/usr/local/bin/hoge.sh add %I ExecStop=/usr/local/bin/hoge.sh remove %I RemainAfterExit=true [Install] WantedBy=multi-user.target
systemd.unit
bugzilla.redhat.com
まず、TAG+="systemd" とした時点で ACTION=="remove"はなんやかんやで利かなくなる。
よって、addのときはsystemd経由でremoveのときは自分でRUN、などはできない。
StopWhenUnneeded
不要になったとき(addに対するremoveのとき)に自動でStopを呼ぶかどうかの設定。
これだけを有効にすると、oneshotのときは 呼び出したプログラムが正常終了した契機でも 不要扱いとなり、Stopが実行されてしまうのでもう一つ設定する。
RemainAfterExit
oneshotのとき、プログラムが正常終了しても ステータスを維持する。
これだけを有効にしても、removeに対する行動はとくに起きない。
この2つの設定をすることで刺さったときも抜けたときも別のプログラムを背後で起動できる