当连接eth0时,我喜欢打开绿色LED(通过GPIO连接)。断开连接时,我想切换绿色LED和红色LED。
认为udev可能是适合它的地方。我创建了简单的演示规则:
KERNEL=="eth0", SUBSYSTEM=="net", ACTION=="add", RUN+="/sbin/set_BSPleds eth0 on"
此规则应在添加eth0时调用脚本。它从未被执行过。 在我通过输入" 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,那么最好的替代方法是什么?
答案 0 :(得分:2)
以太网设备是设备,但连接不是。
您可以通过/dev/xconsole
,dmesg
或/var/log/kern.log
追踪连接。
rsyslog
:你可以(以root身份):
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下,您可以使用超时清空fifo并只读取最后一个条目:
while read -t .01 entry </run/netlink;do line="$entry";done
state=${line#*Link is }
eventtime=${line%% $HOSTNAME*}
shortstate=${state%% *}
Nota:我用/run
来存储fifo。这可能不是更好的地方,因为下次重启时不会存在。
答案 1 :(得分:2)
正如其他人已经提到的那样,似乎无法使用udev。
Ubuntu: wait for network link up and execute a bash command建议
inotifywait -e modify /sys/class/net/eth0/carrier; echo 'Change detected'
(目前,我的盒子上的/是nfs,因此我无法确定它是否有用。)
在其他帖子中,有人担心在/ sys:inotify_add_watch fails on /sys/class/net/eth0/operstate上使用inotify API。
我认为Right Way(TM)这样做的目的是使用netlink(7)API,最好是通过netplugd这样的守护进程。
希望有所帮助:)