udev启动systemd服务并传递内核参数
使用udev规则启动systemd服务并传递内核参数
udev rules
创建udev规则文件/etc/udev/rules.d/99-usb-detect.rules
# Media automounting
SUBSYSTEM=="block", ACTION=="add",TAG+="systemd",ENV{SYSTEMD_WANTS}="my_usb_detect@%k.service"
#SUBSYSTEM=="block", ACTION=="remove", TAG+="systemd",ENV{SYSTEMD_WANTS}="my_usb_detect@%k.service"
#SUBSYSTEM=="block", ACTION=="change", TAG+="systemd",ENV{SYSTEMD_WANTS}="my_usb_detect@%k.service"
%k: $kernel, %k The kernel name for this device.
my_usb_detect@.service
创建/lib/systemd/system/my_usb_detect@.service
[Unit]
Description=usb detect service
[Service]
Type=simple
ExecStart=/usr/local/bin/upgrade.sh %I
#[Install]
#WantedBy=multi-user.target
%I:对应my_usb_detect@%k.service 中的%k
测试脚本
创建/usr/local/bin/usb_detect.sh
#!/bin/bash
sleep 10
echo "[info]: run $0 $1"
测试
重启设备后
插入一个u盘(sda),查看执行结果
systemctl status my_usb_detect@sda
udev规则使用RUN直接调用脚本,耗时任务会被中断,无法正常执行,耗时任务建议使用udev触发systemd来处理。