我的U盘是跟钥匙系一起的,最近两次因为U盘插在公司机器上下班后忘了拿,结果回家后在门口游荡,郁闷的等室友回来才有家门进,于是要做这么个东西,关机前检测到没拔U盘,要猛叫猛叫。
原理倒是不复杂,研究了下,检测U盘可以读取/proc/bus/usb/devices,如果主机上插有U盘,会出现Driver=usb-storage这一行的。
*Update: * /proc/bus/usb/devices只有在挂载了usbfs才有; usbutils工具里面除了lsusb,还提供了usb-devices工具,列出内容跟/proc/bus/usb/devices是一样的, 更适合。
然后是关机脚本的运行。Linux关机时候会执行level 0的init脚本,比如对于Debian/Ubuntu,就是/etc/rc0.d下的文件,我工作机跑的是Archlinux,专门为用户自定命令提供了/etc/rc.local.shutdown文件,作为/etc/rc.shutdown的hook,前者不会因为initscripts包的升级安装被覆盖。
至于让主机会叫,当然是主机喇叭了,这里可没有外放音箱。查了下发现beep这个程序,安装后发现功能还不少,可以定制beep的音调,时长等,可玩性很高。于是先找了音谱频率对照表,按把美剧《24小时》里面CTU内常用的电话铃声谱了出来,大概是EEGC 或者 EEC^C的样子,不过因为主板蜂鸣器的结构区别,通常不同频率的音量有些不同。
另外当然也应该有点视觉提示啦,在init script里面,终端支持的东西多着呢,按终端颜色代码,让终端打印红色加粗闪烁体,足够显眼了。
最终效果是这样的:
1 2 3 4 5 6 7 8 9 10 | #!/bin/bash # # /etc/rc.local.shutdown: Local shutdown script. # while [[ `usb-devices | grep usb-storage` ]]; do echo -e "\033[31;1;5m!!!!!! Unplug Your USB Driver or I'll Keep SCREAMING !!!!!!! \033[0m" beep -f 659.3 -l 200 -D 100 -n -f 659.3 -l 200 -D 200 -n -f 1046 -l 200 -D 50 -n -f 523.3 -l 600 sleep 1; done; |
其他的几组不同八度的响声,记下来以后备用。
1 2 3 4 | #!/bin/bash beep -f 659.3 -l 200 -D 100 -n -f 659.3 -l 200 -D 200 -n -f 784 -l 200 -D 50 -n -f 523.3 -l 600 beep -f 1318.5 -l 200 -D 100 -n -f 1318.5 -l 200 -D 200 -n -f 1568 -l 200 -D 50 -n -f 1046.5 -l 600 beep -f 2637 -l 200 -D 100 -n -f 2637 -l 200 -D 200 -n -f 3136 -l 200 -D 50 -n -f 2093 -l 600 |

哈哈,很geek的做法
我这里既没有/proc/bus/usb/devices终端也不会响铃……
没有/proc/bus/usb/devices可以运行usb-device获得相同内容,包含在usbutils内,跟lsusb同个包;
至于beep,在我家里的本本上也是没声音的,这个跟内核的pcspkr模块有关,不同的硬件有不同的驱动。
记下,以后可能有用。
呵呵,博主应该是搞技术的哈
猛叫猛叫