我知道这个问题类似于“ Udev:重命名我的网络接口”,但我不认为它是重复的,因为我的接口不是通过 udev 规则命名的,并且该问题中的其他答案都不适用于我。
所以我在这台笔记本电脑上有一个 WiFi 适配器,我想将接口从 wlp5s0 重命名为 wlan0:
root@aj-laptop:/etc/udev/rules.d# iwconfig
wlp5s0 IEEE 802.11 ESSID:off/any
Mode:Managed Access Point: Not-Associated Tx-Power=off
Retry short limit:7 RTS thr:off Fragment thr:off
Encryption key:off
Power Management:on
eth0 no wireless extensions.
lo no wireless extensions.
root@aj-laptop:/etc/udev/rules.d# ifconfig wlp5s0
wlp5s0: flags=4098<BROADCAST,MULTICAST> mtu 1500
ether 00:80:34:1f:d8:3f txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped …Run Code Online (Sandbox Code Playgroud) 所以我只是想知道我对 udev 的解释及其工作原理是否正确,我的理解是否正确,请告诉我。
所以我对udev的理解是它是Linux 上的动态设备管理器,作为守护进程运行。
这基本上是我目前的理解,如果我错了,请纠正我,并告诉我额外的信息。
我刚刚开始深入了解 Linux 的内部结构,我想知道 udev 和 hal 守护进程之间有什么区别。据我所知,两者似乎都负责管理热插拔设备...... udev 停止使用它们来监听,还是它们是两个独立的东西?
我想在连接 USB 调制解调器时运行ppp连接,因此我使用以下udev规则:
ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="16d8",\
RUN+="/usr/local/bin/newPPP.sh $env{DEVNAME}"Run Code Online (Sandbox Code Playgroud)
(我的调制解调器显示/dev为ttyACM0)
新建PPP.sh:
#!/bin/bash
/usr/bin/pon prov $1 >/dev/null 2>&1 &
Run Code Online (Sandbox Code Playgroud)
该udev事件触发,并newPPP.sh正在运行,但newPPP.sh过程后〜4-5s杀害。ppp没有时间连接(拨号超时为 10 秒)。
我怎样才能运行很长时间的进程,不会被杀死?
我尝试使用nohup,但它也不起作用。
系统:Arch Linux
更新
感谢maxschlepzig,我在这里找到了解决方案。
我at now用来运行与 udev 进程分离的作业。
但有一个问题仍未得到解答:为什么有效nohup而&无效?
我正在运行 Arch Linux,我有一个 udev 规则,它在插入设备时启动服务。在这种情况下,它会在插入 3G 调制解调器时拨打连接。
KERNEL=="ttyUSB*", SYMLINK=="gsmmodem", TAG+="systemd", ENV{SYSTEMD_WANTS}="netcfg@wvdial.service"
Run Code Online (Sandbox Code Playgroud)
但是,如果设备被移除,systemd 不会停止该服务,因此当它再次插入时,它不会启动该服务,因为它已经在运行。
我需要的是一个匹配的 udev 规则,该规则在移除设备以停止服务时运行。
使用下面的答案,我现在拥有的是以下 udev 规则
KERNEL=="ttyUSB*", SYMLINK=="gsmmodem", TAG+="systemd", ENV{SYSTEMD_WANTS}="vodafone.service"
Run Code Online (Sandbox Code Playgroud)
使用以下服务文件(基本上是从 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
Run Code Online (Sandbox Code Playgroud)
我正在使用netcfg-wvdialAUR 进行拨号。
我有两只鼠标,其中一只存在鼠标中键和 button6 同时触发的问题。所以我配置~/.Xmodmap了禁用这个按钮。然而,与此同时,我希望我的另一只鼠标仍然可以使用此按钮。所以我写了一个udev规则,xmodmap根据连接的鼠标来改变按钮布局。
这是我目前的设置:
/etc/udev/rules.d/logitech-g7.rules:
# deactivate MB 6 when mouse 1 is connected
ACTION=="add", ENV{DEVTYPE}=="usb_device", ENV{ID_VENDOR_ID}=="046d", ENV{ID_MODEL_ID}=="c51a", RUN+="/home/user/.scripts/Troubleshooting/Bugfixes/mouseswitcher_wrapper 1", OWNER="user"
# restore defaults when mouse 1 is disconnected
ACTION=="remove", ENV{DEVTYPE}=="usb_device", ENV{ID_VENDOR_ID}=="046d", ENV{ID_MODEL_ID}=="c51a", RUN+="/home/user/.scripts/Troubleshooting/Bugfixes/mouseswitcher_wrapper 0", OWNER="user"
Run Code Online (Sandbox Code Playgroud)
/home/user/.scripts/Troubleshooting/Bugfixes/mouseswitcher_wrapper:
#!/bin/bash
/home/user/.scripts/Troubleshooting/Bugfixes/mouseswitcher "$1"&
Run Code Online (Sandbox Code Playgroud)
/home/user/.scripts/Troubleshooting/Bugfixes/mouseswitcher
#!/bin/bash
sleep 1
DISPLAY=":0.0"
HOME=/home/user/
XAUTHORITY=$HOME/.Xauthority
export DISPLAY XAUTHORITY HOME
if [[ "$1" == 1 ]] #differentiate between ADD (1) event and REMOVE (0) event
then
/usr/bin/xmodmap /home/user/.XmodmapG7 > /dev/null …Run Code Online (Sandbox Code Playgroud) 我使用 Linux Mint 13 MATE,并且在插入/拔出设备时尝试设置通知。
首先,我找到了udev-notify包,但不幸的是它几乎对我不起作用:它工作的时间很短(1-2 分钟),然后,如果我连接/断开任何设备,它会崩溃:
Traceback (most recent call last):
File "./udev-notify.py", line 319, in <module>
notification.show()
glib.GError: GDBus.Error:org.freedesktop.DBus.Error.ServiceUnknown: The name :1.1061 was not provided by any .service files
Run Code Online (Sandbox Code Playgroud)
我还没有找到任何解决方案,所以我不得不将其删除。(日提交错误报告也)
令人惊讶的是,到目前为止我还没有找到类似的实用程序。然后我尝试编写应该匹配所有设备的 udev 规则。我添加了新文件/etc/udev/rules.d/notify.rules:
ACTION=="add", RUN+="/bin/bash /home/dimon/tmp/device_plug.sh"
ACTION=="remove", RUN+="/bin/bash /home/dimon/tmp/device_unplug.sh"
Run Code Online (Sandbox Code Playgroud)
和两个脚本:
device_plug.sh:
#!/bin/bash
export DISPLAY=":0"
notify-send "device plugged"
/usr/bin/play -q /path/to/plug_sound.wav &
Run Code Online (Sandbox Code Playgroud)
device_unplug.sh:
#!/bin/bash
export DISPLAY=":0"
notify-send "device unplugged"
/usr/bin/play -q /path/to/unplug_sound.wav &
Run Code Online (Sandbox Code Playgroud)
它有效,但它的工作非常愚蠢。我的问题是:
lsusb输出中看到的相同?目前,我只收到诸如“已插入”和“未插入”之类的通知,但我找不到如何在我的 udev 规则中检索设备名称(如果可以,我会将它作为范围)下的每个设备节点/dev都有自己的主要/次要编号对。我知道我们可以通过 的方式从设备节点检索这对数字stat,如下所示:
stat -c 'major: %t minor: %T' <file>
Run Code Online (Sandbox Code Playgroud)
或者,ls -l也显示这些数字。
但是我们如何通过给定的主要和次要编号获得设备节点?我知道的唯一方法是某种ls -l+awk技巧,但我真的希望有更好的解决方案。
我已经写文件90-usb.rules下/etc/udev/rules.d/包含:
ACTION=="add", ATTR{idVendor}=="0bb4", ATTR{idProduct}=="2008", RUN+="/bin/mkdir /home/pandya/Desktop/testdir"
ACTION=="remove", ATTR{idVendor}=="0bb4", ATTR{idProduct}=="2008", RUN+="/bin/rmdir /home/pandya/Desktop/testdir"
Run Code Online (Sandbox Code Playgroud)
当我插入设备时 udevACTION=="add"通过RUN+="/bin/mkdir /home/pandya/Desktop/testdir"(工作正常)创建目录
但是当我拔下类似 udev 的设备时ACTION=="remove ,不会通过以下方式删除目录RUN+="/bin/rmdir /home/pandya/Desktop/testdir"
没有问题,/bin/rmdir因为我也检查过用另一个mkdir( RUN+="/bin/mkdir /home/pandya/Desktop/testdir2")替换它,但这也不起作用。
所以,我想知道为什么删除操作不起作用?我如何解决它?