编写udev规则以停止systemd下的服务的正确方法是什么


12

我正在运行Arch Linux,并且具有udev规则,该规则可在插入设备时启动服务。在这种情况下,当插入3G调制解调器时,它将拨打连接。

KERNEL=="ttyUSB*", SYMLINK=="gsmmodem", TAG+="systemd", ENV{SYSTEMD_WANTS}="netcfg@wvdial.service"

但是,如果卸下了该设备,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进行拨号。

Answers:


11

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

报价单:

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

您只需要像下面那样编辑服务文件。

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

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


这是否意味着我不需要udev规则?我尝试按照您的建议进行操作,方法是创建一个新的服务文件来替换netcfg @ wvdial.service并包括这两行。它似乎确实现在停止了服务,但是当再次插入设备时它没有启动。
crazystick

@crazystick您仍然需要udev规则来启动服务,我的意思是,您将不需要使用udev来停止它。
brunocodutra

得到它了。在udev规则和修改后的服务文件中都可以很好地工作。
crazystick 2013年

2
您可以使用StopWhenUnneeded=true,而不是BindsToAfter
SergA

@SergA由我回答了这个有时间的错误防止StopWhenUnneeded=true从工作,但我相信它已经固定了相当一段时间了。
brunocodutra '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.