Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何为ETH建立udev规则;“向下链接”/&引用;“连接”吗;?_Linux_Udev_Bash - Fatal编程技术网

Linux 如何为ETH建立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电缆时

当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电缆时没有发生任何事件

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'