问题描述
我在带有板载USB集线器(特别是BeagleBone Black)的微处理器上有一个嵌入式Linux系统(运行Ubuntu 10)。
我制作了一个简单的bash脚本,该脚本应该运行命令watch lsusb
;并且在运行时,我的程序需要将命令生成的输出转储到文本或JSON文件中(理想情况下,在USB记忆棒上,示例中称为usb0
)。
到目前为止,这就是我所拥有的:
#!/bin/bash
#DATE=$(date +'%F %H:%M:%S')
DIR=/home/ubuntu/lsusb_logs
CMD='watch lsusb'
$CMD > $DIR
这一直运行到我停止它为止,这很好。但是当我查看我现在创建的lsusb_logs
文件时,所有数据似乎都已编码或需要格式化,因为它根本不像单个lsusb
甚至是{{ 1}}输出。
此脚本的目的是在环境室内24小时内收集USB集线器状态下的外围设备的历史数据(气候压力测试)。
任何建议或见解都会有所帮助,谢谢。
解决方法
watch
将打印一些不可读的字符,因为它每次运行命令时都需要清除屏幕。但是,您可以在无限的while循环中运行该命令,并需要一定的延迟:
while true; do
lsusb >> lsusb_logs
sleep 1 # 1 second delay
done
,
您可以采取另一种方法,而不是无限期地遍历同一重复命令。
您可以利用udev
监视plugged
或unplugged
USB设备,并在那时执行脚本。
示例,创建2个脚本:
vi /bin/device_added.sh
vi /bin/device_removed.sh
它将ACTION(添加或删除)记录到日志文件中,
并使这些可执行文件:
chmod +x /bin/device_added.sh
chmod +x /bin/device_removed.sh
然后创建一个udev规则,其中将包含检测到设备更改时的触发器:
vi /etc/udev/rules.d/80-test.rules
其中将包含例如:
SUBSYSTEM=="usb",ACTION=="add",ENV{DEVTYPE}=="usb_device",RUN+="/bin/device_added.sh"
SUBSYSTEM=="usb",ACTION=="remove",RUN+="/bin/device_removed.sh"
这样,您的2个脚本仅在更改时记录,而不是始终记录。