我正在运行 Arch Linux,并且有一个 udev 规则,该规则在插入设备时启动服务。在这种情况下,它会在插入 3G 调制解调器时拨打连接。
KERNEL=="ttyUSB*", SYMLINK=="gsmmodem", TAG+="systemd", ENV{SYSTEMD_WANTS}="[email protected]"
但是,如果设备被移除,systemd 不会停止该服务,因此当再次插入时,它不会启动该服务,因为它已经在运行。
我需要的是一个匹配的 udev 规则,该规则在删除设备以停止服务时运行。
更新
使用下面的答案,我现在拥有的是以下 udev 规则
KERNEL=="ttyUSB*", SYMLINK=="gsmmodem", TAG+="systemd", ENV{SYSTEMD_WANTS}="vodafone.service"
使用以下服务文件(基本上是从 netcfg 服务文件复制并粘贴的:
[Unit]
Description=Netcfg networking service for Vodafone Dongle
Before=network.target
Wants=network.target
BindsTo=dev-gsmmodem.device
After=dev-gsmmodem.device
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/netcfg check-iface wvdial
ExecStop=-/usr/bin/netcfg down wvdial
KillMode=none
[Install]
WantedBy=multi-user.target
我正在使用netcfg-wvdial
AUR 进行拨号。
答案1
您的问题可以仅使用 systemd 来解决,只需指定您的服务需要或者,甚至更好,绑定到给定的设备。
引用:
“如果其他[必需/绑定]单位之一被停用或其激活失败,则该单位[服务]将被停用”
您只需编辑您的服务文件,如下所示。
[Unit]
<...>
BindsTo=<DEVICE UNIT HERE>.device
<...>
After=<DEVICE UNIT HERE>.device
注意:要获取所有可用设备单元文件的列表,请使用systemctl list-units --all --full | grep ".device"