首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在systemd下编写udev规则以停止服务的正确方法是什么?

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

Unix & Linux用户
提问于 2013-01-31 11:24:17
回答 1查看 11K关注 0票数 13

我正在运行Arch,我有一个udev规则,它在插入设备时启动服务。在这种情况下,当插入3G调制解调器时,它会拨号连接。

代码语言:javascript
复制
KERNEL=="ttyUSB*", SYMLINK=="gsmmodem", TAG+="systemd", ENV{SYSTEMD_WANTS}="netcfg@wvdial.service"

但是,如果设备被移除,systemd将不会停止服务,因此当再次插入时,它将不会启动服务,因为它已经在运行。

我需要的是一个匹配的udev规则,当设备被移除以停止服务时运行。

更新

使用下面的答案,我现在拥有的是以下udev规则

代码语言:javascript
复制
KERNEL=="ttyUSB*", SYMLINK=="gsmmodem", TAG+="systemd", ENV{SYSTEMD_WANTS}="vodafone.service"

使用以下服务文件(基本上是从netcfg服务文件复制和粘贴的):

代码语言:javascript
复制
[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来做拨号。

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2013-09-08 21:31:23

您的问题可能仅使用systemd解决,只需指定您的服务需要,甚至更好的是,指定给定设备的BindsTo

引用:

如果另一个[必需/绑定]单位被停用或激活失败,则此单位[服务]将被停用

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

代码语言:javascript
复制
[Unit]
<...>
BindsTo=<DEVICE UNIT HERE>.device
<...>
After=<DEVICE UNIT HERE>.device

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

票数 12
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/63232

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档