当连接eth0时,我喜欢打开绿色LED(通过GPIO连接)。 断开连接时,我喜欢切换绿色LED和红色LED。
认为udev也许是正确的地方。 我创build了简单的演示规则:
KERNEL=="eth0", SUBSYSTEM=="net", ACTION=="add", RUN+="/sbin/set_BSPleds eth0 on"
这个规则应该在添加eth0时调用一个脚本。 它从未被执行。 在通过在shell中input“udevadm monitor -k -u”来查看udev监视器之后。 拔下插头时,没有事件发生。
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的帮助下构build一个定制的Linux。
我的问题是,如何获得“链接”/“链接”事件到udev? 如果它不适用于udev,最好的select是什么?
以太网设备是设备,但连接不是。
您可以通过/dev/xconsole
, dmesg
或/var/log/kern.log
来跟踪连接。
rsyslog
: 你可以(作为根):
echo ':msg, contains, "Link is" |/run/netlink' >/etc/rsyslog.d/netlinkstate.conf mkfifo /run/netlink chgrp user /run/netlink chmod 640 /run/netlink service rsyslog force-reload
然后,以用户身份登录,只需:
read line < /run/netlink
将等待来自FIFO的输入,然后保持,直到发生。
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
在bash下 ,你可以使用timeout来清空fifo并且只读最后一个条目:
while read -t .01 entry </run/netlink;do line="$entry";done state=${line#*Link is } eventtime=${line%% $HOSTNAME*} shortstate=${state%% *}
Nota:我用/run
存储fifo。 这可能不是更好的地方,因为这将不会在下次重新启动。
正如其他人已经提到,似乎不能用这个udev。
Ubuntu:等待网络连接并执行bash命令建议
inotifywait -e modify /sys/class/net/eth0/carrier; echo 'Change detected'
(目前,/我的盒子上的nfs,所以我不能说,如果它会工作。)
在其他文章中,有一些关于在/ sys上使用inotify API的问题: inotify_add_watch在/ sys / class / net / eth0 / operstate上失败 。
我认为正确的方法(TM)做到这一点将是使用netlink(7)API,最好通过守护进程,如netplugd。
希望帮助:)