![如何找出哪个程序导致电脑扬声器发出蜂鸣声?](https://linux22.com/image/1322566/%E5%A6%82%E4%BD%95%E6%89%BE%E5%87%BA%E5%93%AA%E4%B8%AA%E7%A8%8B%E5%BA%8F%E5%AF%BC%E8%87%B4%E7%94%B5%E8%84%91%E6%89%AC%E5%A3%B0%E5%99%A8%E5%8F%91%E5%87%BA%E8%9C%82%E9%B8%A3%E5%A3%B0%EF%BC%9F.png)
我如何追踪哪个程序导致计算机定期发出蜂鸣声?
发出哔哔声通常是通过写入某些内容引起的吗/dev/tty*
?如何监控哪些程序正在写入/dev/tty*
?
蜂鸣声的频率与我听到的频率不一样printf '\a' > /dev/tty1
。
它在 消失rmmod pcspkr
,又在 再次出现modprobe pcspkr
。
答案1
在 Linux 和大多数基于 UNIX 的操作系统上,只需打印 BELL 字符(Ctrl+G 或“\a”)就会触发蜂鸣声。
这是通过ioctl()
系统调用实现的,它位于您的 shell 中(bash 等支持此功能)。然后,系统调用经过内核,最终由设备pcspkr
(内核模块)实现。您可以看到它pcspkr
已加载lsmod
,并使用modprobe -r
或卸载rmmod
。
考虑蜂鸣声时,不要考虑 /dev/tty,因为即使没有绑定到 TTY 的无头程序也能发出蜂鸣声。运行strace -eioctl bash
并在 bash 提示符下运行echo ^a
。您会发现发出蜂鸣声是一个简单但相当具体的ioctl()
调用(#include
<sys/ioctl.h>
如果<linux/kd.h>
编写 C/C++ 程序来执行此操作)。
参考:
答案2
使用这个脚本(谨慎尝试)
function ppid() { cat /proc/"$1"/status | grep PPid: | grep -o "[0-9]*"; };
function pidtree() { P=$1; while [ "$P" != "1" ]; do echo $P; P=`ppid $P`; done; echo 1; };
strace -fe execve `( pgrep ''; pidtree $$ ) | sort | uniq -u | sed 's/^/-p /'`
我发现 ImageMagick 的“导入”功能会定期截取屏幕截图并发出哔哔声。已添加-silent
— 现在哔哔声消失了。