Linux 如何为ETH建立udev规则;“向下链接”/&引用;“连接”吗;?
当eth0连接时,我喜欢打开绿色LED(通过GPIOs连接)。断开连接时,我喜欢打开的绿色LED和红色LED 我想udev可能是个合适的地方。我创建了简单的演示规则:Linux 如何为ETH建立udev规则;“向下链接”/&引用;“连接”吗;?,linux,udev,bash,Linux,Udev,Bash,当eth0连接时,我喜欢打开绿色LED(通过GPIOs连接)。断开连接时,我喜欢打开的绿色LED和红色LED 我想udev可能是个合适的地方。我创建了简单的演示规则: KERNEL=="eth0", SUBSYSTEM=="net", ACTION=="add", RUN+="/sbin/set_BSPleds eth0 on" 添加eth0时,此规则应调用脚本。它从未被执行过。 在我通过在shell中输入“udevadm monitor-k-u”查看udev监视器之后。拔下/插入lan电缆时
KERNEL=="eth0", SUBSYSTEM=="net", ACTION=="add", RUN+="/sbin/set_BSPleds eth0 on"
添加eth0时,此规则应调用脚本。它从未被执行过。
在我通过在shell中输入“udevadm monitor-k-u”查看udev监视器之后。拔下/插入lan电缆时没有发生任何事件
root@sama5d3xek:/etc/udev/rules.d# udevadm monitor -k -uh0
monitor will print the received events for:
UDEV - the event which udev sends out after rule processing
KERNEL - the kernel uevent
root@sama5d3xek:/etc/udev/rules.d#
似乎没有eth0的事件。以太网驱动程序由我的ATMEL提供。在Yocto的帮助下,我正在构建一个定制的Linux
我的问题是,如何将“链接下降”/“链接上升”事件发送到udev?
如果它不适用于udev,那么哪种替代方法是最好的?以太网设备是设备,但连接不是 您可以通过
/dev/xconsole
、dmesg
或/var/log/kern.log
跟踪连接
样本,使用rsyslog:
您可以(作为root用户):
然后,以用户身份登录,只需:
或
在下,您可以使用超时清空fifo和只读最后一项:
while read -t .01 entry </run/netlink;do line="$entry";done
state=${line#*Link is }
eventtime=${line%% $HOSTNAME*}
shortstate=${state%% *}
而read-t.01 entry正如其他人已经提到的,似乎不能使用udev来实现这一点
暗示
inotifywait -e modify /sys/class/net/eth0/carrier; echo 'Change detected'
(目前,/在nfs上用于我的box,因此我不能确定它是否有效。)
在其他帖子中,对于在/sys:上使用inotifyapi存在一些顾虑
我认为(TM)这样做的正确方法是使用netlink(7)API,最好是通过netplugd这样的守护进程
希望能有所帮助:)这个问题最好在feel free上提出,创建一个类似的问题,我将链接到它,就像我必须创建一个通过systemV启动的脚本一样。这是在dmesg和灰色eth*上永久读取,或者在向上时通过或向下时通过脚本读取。这取决于你的Linux发行版。我在那里发布了一个更详细的答案:你的编辑被拒绝了,因为其中有很多不好的做法。。。跟踪事件最好通过与syslog交互来完成。我建议您将建议的脚本作为一个新问题发布。您可以遵循/var/log/kern.log
或/proc/kmsg
,但不要汇集事件!即使您的/
在nfs上,/sys
仍然从内核装载。因此,这必须与其他基于rootfs的/
。。。(阅读/sys
分区上关于inotify的备注。
state=${line#*Link is } eventtime=${line%% $HOSTNAME*}
echo $eventtime $state
2016-11-21T17:40:50.956181+01:00 Down
echo $eventtime $state
2016-11-21T17:40:50.956181+01:00 Up 100 Mbps Full Duplex, Flow Control: Rx/Tx
echo $eventtime ${state%% *}
2016-11-21T17:40:50.956181+01:00 Up
while read -t .01 entry </run/netlink;do line="$entry";done
state=${line#*Link is }
eventtime=${line%% $HOSTNAME*}
shortstate=${state%% *}
inotifywait -e modify /sys/class/net/eth0/carrier; echo 'Change detected'