揮発性のメモ2

知識をメモ書きしておく

udevでバックグラウンドで動くプログラムを起動する 3

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つの設定をすることで刺さったときも抜けたときも別のプログラムを背後で起動できる