udev启动systemd服务并传递内核参数

发布时间 2023-03-23 16:53:48作者: Amumu1

使用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来处理。