更新

更新

我正在运行 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-wvdialAUR 进行拨号。

答案1

您的问题可以仅使用 systemd 来解决,只需指定您的服务需要或者,甚至更好,绑定到给定的设备。

引用:

“如果其他[必需/绑定]单位之一被停用或其激活失败,则该单位[服务]将被停用”

您只需编辑您的服务文件,如下所示。

[Unit]
<...>
BindsTo=<DEVICE UNIT HERE>.device
<...>
After=<DEVICE UNIT HERE>.device

注意:要获取所有可用设备单元文件的列表,请使用systemctl list-units --all --full | grep ".device"

相关内容