起因是实验室的主机USB驱动或者供电有问题,部分主机频繁出现USB断连的情况,通过dmesg查看报错 xHCI host controller not responding, assume dead
几经波折终于找到了拯救方案——https://bbs.archlinux.org/viewtopic.php?id=236536
但是!但是还存在另一个问题,总不能时时刻刻盯着服务器看有无断连吧,特别是晚上,遇到一些重要任务还是提心吊胆的QAQ,最好还是能够有自动监控的工具,定时帮忙检查一下有无出现上述情况!
刚好!linux有个现成的定时任务工具可用!
其实不是很懂,现学现用的:https://www.runoob.com/linux/linux-comm-crontab.html
- 先写一个执行脚本:检查是否usb断连,如果断连就重启xHCI服务,记得要给脚本执行权限(chmod +x xx.sh)
#!/bin/bash
# 这里我加入了 >> ./a.log是指把输出写入到a.log文件中,方便我查看定时器执行的结果
echo "定时检查lsusb状态" >> ./a.log
# 这个是加上时间戳,方面查看在哪些时间执行了定时任务,确认定时任务是否执行成功
mdhhmiss=`date "+%m%d%H%M%S"`
echo $mdhhmiss >> ./a.log
# 其实这里如果能判断dmesg或syslog是否存在assume dead会更好,后面再慢慢整一下…
# 为什么现在grep这个Realtek…对比一下断连前后lsusb的结果就知道;
# Realtek是hub上usb端口的名称,如果grep不到Realtek说明hub已经没连上了
status=`lsusb | grep Realtek`
if [ -z "$status" ];thenecho "啊噢,断连了" >> ./a.logecho $status >> ./a.logecho -n "0000:00:14.0" | tee /sys/bus/pci/drivers/xhci_hcd/unbindsleep 5echo -n "0000:00:14.0" | tee /sys/bus/pci/drivers/xhci_hcd/bindfi
- 由于这个重启服务需要root用户执行,所以需要在root用户中创建一个定时任务
- 先切换到root用户(ps:如果一直提示密码错误/认证失败,可能是你没有设置root用户密码,先执行 sudo passwd root设置密码就好了)
- 执行 crontab -u root -e(第一次执行后可能会弹出让你选择编辑器,选自己顺手的就好,我一般选vim/basic)
- 然后按照特定的语法设置定时任务就好(语法参考https://www.runoob.com/linux/linux-comm-crontab.html,里面有很多实例,可以自行设置想要的时间间隔)