暂停bash脚本,直到“dmesg-w”输出任何内容

暂停bash脚本,直到“dmesg-w”输出任何内容,bash,Bash,我遇到了这个漂亮的命令dmesg-w,它将在插入/删除新设备时输出设备信息 是否有方法使用此命令暂停脚本,直到用户插入任何类型的USB或SSD卡?我正在考虑重定向输出并以某种方式使用read 我通常使用下面的两个命令从dmesg获取设备名称: SSD_DMESG=$(dmesg | tail -n1 | grep -o 'sd[[:lower:]]') SSD=/dev/$SSD_DMESG 此脚本统计dmesg队列中当前有多少个sd[:lower:]行。然后等待更多的行出现。当他们这样做时,

我遇到了这个漂亮的命令dmesg-w,它将在插入/删除新设备时输出设备信息

是否有方法使用此命令暂停脚本,直到用户插入任何类型的USB或SSD卡?我正在考虑重定向输出并以某种方式使用read

我通常使用下面的两个命令从dmesg获取设备名称:

SSD_DMESG=$(dmesg | tail -n1 | grep -o 'sd[[:lower:]]')
SSD=/dev/$SSD_DMESG

此脚本统计dmesg队列中当前有多少个sd[:lower:]行。然后等待更多的行出现。当他们这样做时,它会打印他们:

#!/bin/sh
n=$(dmesg | grep  'sd[[:lower:]]' | wc -l)
while [ "$n" -eq "$(dmesg | grep  'sd[[:lower:]]' | wc -l)" ]
do
        sleep 0.1s
done
sleep 0.1s
dmesg | grep  'sd[[:lower:]]' | tail -n+$n
wc-l用于提供行计数。tail-n+$n用于删除先前的现有行。最后一次睡眠的目的是让内核有时间完成对设备的处理

以上是冗长的。如果你只是想要sd?符号,无其他信息,请尝试:

#!/bin/sh
n=$(dmesg | grep -o  'sd[[:lower:]]' | wc -l)
while [ "$n" -eq "$(dmesg | grep -o  'sd[[:lower:]]' | wc -l)" ]
do
    sleep 0.1s
done
sleep 0.1s
dmesg | grep -o 'sd[[:lower:]]' | tail -n+$n | sort -u

此脚本统计dmesg队列中当前有多少个sd[:lower:]行。然后等待更多的行出现。当他们这样做时,它会打印他们:

#!/bin/sh
n=$(dmesg | grep  'sd[[:lower:]]' | wc -l)
while [ "$n" -eq "$(dmesg | grep  'sd[[:lower:]]' | wc -l)" ]
do
        sleep 0.1s
done
sleep 0.1s
dmesg | grep  'sd[[:lower:]]' | tail -n+$n
wc-l用于提供行计数。tail-n+$n用于删除先前的现有行。最后一次睡眠的目的是让内核有时间完成对设备的处理

以上是冗长的。如果你只是想要sd?符号,无其他信息,请尝试:

#!/bin/sh
n=$(dmesg | grep -o  'sd[[:lower:]]' | wc -l)
while [ "$n" -eq "$(dmesg | grep -o  'sd[[:lower:]]' | wc -l)" ]
do
    sleep 0.1s
done
sleep 0.1s
dmesg | grep -o 'sd[[:lower:]]' | tail -n+$n | sort -u
udevadm的监控模式将在生成uevents时提供uevents提要:

grep --line-buffered -o -m1 'sd[a-z] ' \
   <(stdbuf -i0 -o0 udevadm monitor --kernel --subsystem-match=block)
这里有几件事值得注意:

stdbuf是用来做杂耍的。 -LineBuffered告诉grep在每一行输入时输出它,而不是潜在地将它保存在缓冲区中。 udevadm的监控模式将在生成uevents时提供uevents提要:

grep --line-buffered -o -m1 'sd[a-z] ' \
   <(stdbuf -i0 -o0 udevadm monitor --kernel --subsystem-match=block)
这里有几件事值得注意:

stdbuf是用来做杂耍的。 -LineBuffered告诉grep在每一行输入时输出它,而不是潜在地将它保存在缓冲区中。
我最近刚刚解决了同样的问题。我正在尝试监视dmesg,以便在USB MIDI设备连接时发现它们

首先,我们不要使用dmesg-w,因为这样做还将显示过去最近发生的事件。相反,让我们在刷新模式下跟踪/var/log/messages,指定最初显示的0行:

tail-f-n0'/var/log/messages'

现在我们知道了要监视的命令,我们如何等待满足条件的新dmesg条目,然后终止轮询?幸运的是,bash重定向可以轻松地将任务放到后台,然后访问其STDOUT和STDIN:

执行委员会3&-

请注意,取消设置文件描述符也会通过绑定到它的SIGPIPE命令终止,因此在本例中,我们不必担心清理尾部操作

现在我们知道了如何将background命令绑定和解除绑定到文件描述符,我们可以执行while循环,该循环将读取和处理通过文件描述符3提供的每行文本:


如果您想实现一个不以这种方式使用bash文件重定向的解决方案,请参考在中记录的几个有用的替代方案。

我最近刚刚解决了同样的问题。我正在尝试监视dmesg,以便在USB MIDI设备连接时发现它们

首先,我们不要使用dmesg-w,因为这样做还将显示过去最近发生的事件。相反,让我们在刷新模式下跟踪/var/log/messages,指定最初显示的0行:

tail-f-n0'/var/log/messages'

现在我们知道了要监视的命令,我们如何等待满足条件的新dmesg条目,然后终止轮询?幸运的是,bash重定向可以轻松地将任务放到后台,然后访问其STDOUT和STDIN:

执行委员会3&-

请注意,取消设置文件描述符也会通过绑定到它的SIGPIPE命令终止,因此在本例中,我们不必担心清理尾部操作

现在我们知道了如何将background命令绑定和解除绑定到文件描述符,我们可以执行while循环,该循环将读取和处理通过文件描述符3提供的每行文本:

如果您想实现一个不以这种方式使用bash文件重定向的解决方案,请参考一些有用的替代方案。

这是我的两分钱。使用timeout、journalctl、stdbuf和grep;因此:

让我们从格雷普开始。带有的-l选项会使grep在找到匹配项后立即返回-行缓冲消除了仅使用grep的缓冲问题什么都配

journalctl-b-f告诉journalctl从启动时开始打印消息,并继续输出消息直到终止。这意味着您不必担心您要查找的消息发生在您呼叫dmesg之前的比赛条件

stdbuf将消除journalctrl的缓冲问题

现在是 在coup de gras中,如果超时命令后面的命令在给定的秒数之前未终止,则超时命令将终止所有操作;漂亮

这是我的两分钱。使用timeout、journalctl、stdbuf和grep;因此:

让我们从格雷普开始。带有的-l选项会使grep在找到匹配项后立即返回-行缓冲消除了仅使用grep的缓冲问题什么都配

journalctl-b-f告诉journalctl从启动时开始打印消息,并继续输出消息直到终止。这意味着您不必担心您要查找的消息发生在您呼叫dmesg之前的比赛条件

stdbuf将消除journalctrl的缓冲问题


现在对于coup de gras,如果在给定的秒数之前超时命令未终止,则超时命令将终止所有操作;漂亮

您正在使用的哪些操作系统支持dmesg的-w标志?在Linux上,至少有更好的方法在设备插入和删除时触发事件-您可以使用udev或您的操作系统附带的任何等效工具,仅在设备插入和删除时触发,而无需持续监视。@Nick Russo我正在使用ArchLinux@Charles Duffy我没有udev,但我有udevadm。@71GA,udev不是命令,它是可以配置的守护进程。如果您有udevadm,那么您就有udev,并且可以在/etc/udev/rules.d下创建一个适当的配置文件,该文件将告诉udev在发生插入或拔出事件时启动脚本。查看您使用的支持dmesg-w标志的操作系统?在Linux上,至少有更好的方法触发设备插入和删除事件-您可以使用udev或您的操作系统附带的任何等效工具,仅在设备插入和删除时触发,而无需持续监视。@Nick Russo我使用的是ArchLinux@Charles Duffy我没有udev,但我有udevadm。@71GA,udev不是命令,它是可以配置的守护进程。如果您有udevadm,那么您就有udev,并且可以在/etc/udev/rules.d下创建一个适当的配置文件,该文件将告诉udev在发生插入或拔出事件时启动脚本。看哦,谢谢这是增量的一个很好的实现谢谢这是增量的一个很好的实现D