랩톱 일시 중지를 해제할 때마다 열려 있는(실행 중인) tmux 창이 dmesg -w
켜집니다.
tmux 매뉴얼 페이지에서 이는 창에서 실행 중인 애플리케이션이 터미널 벨을 울렸다는 것을 의미합니다.
기본적으로 동일한 설정(동일한 OS, 동일한 tmux 구성)을 가진 다른 컴퓨터가 있는데 이런 일은 발생하지 않습니다. 이 특정 노트북에서만 발생합니다. 이 시스템에서 일시 중지가 해제되면 dmesg에서 터미널 차임 소리가 나는 이유는 무엇입니까?
소프트웨어 버전:
$ uname -a
Linux localhost 3.10.18 #1 SMP Mon Jan 8 23:08:08 PST 2018 armv7l armv7l armv7l GNU/Linux
$ lsb_release -cr
Release: 16.04
Codename: xenial
$ tmux -V
tmux 2.6
$ dmesg --version
dmesg from util-linux 2.27.1
답변1
dmesg의 출력을 확인하면 ASCII BEL 문자를 검색하여 벨이 울리는 시기를 정확히 확인할 수 있습니다 \a
.
$ dmesg | grep -C1 $'\a'
[ 5.706427] usb 1-2: Manufacturer: HD WebCam
[ 5.706434] usb 1-2: SerialNumber: NC2141103Q533020AALM03
[ 5.798439] Unsafe core_pattern used with suid_dumpable=2. Pipe handler or fully qualified core dump path required.
--
[13843.531106] usb 1-2: Manufacturer: HD WebCam
[13843.531115] usb 1-2: SerialNumber: NC2141103Q533020AALM03
[13843.546586] uvcvideo: Found UVC 1.00 device HD WebCam (0bda:57cf)
흥미롭게도 웹캠을 초기화하는 과정에서 벨이 울리는 것 같습니다. BEL이 od 파이프를 통해 인쇄하는 줄의 위치를 정확히 확인할 수 있습니다.
$ dmesg | grep $'\a' | head -n 1 | od -c
0000000 [ 5 . 7 0 6 4 3 4 ] u
0000020 s b 1 - 2 : S e r i a l N u
0000040 m b e r : \a N C 2 1 4 1 1 0 3
0000060 Q 5 3 3 0 2 0 A A L M 0 3 \n
0000076
여기서 BEL은 으로 표시되며 \a
시퀀스 번호( ) 앞에 인쇄됩니다 SerialNumber: ␇NC214...
. dmesg가 줄 중간에 BEL을 삽입할 가능성은 거의 없으므로 커널이 이를 기록할 수도 있습니다.
소스코드를 확인해 보겠습니다. 어쩌면 USB 드라이버가 일련번호를 기록하는 동안 벨소리를 인쇄하고 있을 수도 있습니다. 우리는 사용할 수 있습니다살아있는 grepLinux 4.12 소스 코드를 빠르게 검색하면 관련 파일이 drivers/usb/core/hub.c
.만병 통치약을 클릭하고 관련 기능을 찾으세요.
static void announce_device(struct usb_device *udev)
{
dev_info(&udev->dev, "New USB device found, idVendor=%04x, idProduct=%04x\n",
le16_to_cpu(udev->descriptor.idVendor),
le16_to_cpu(udev->descriptor.idProduct));
dev_info(&udev->dev,
"New USB device strings: Mfr=%d, Product=%d, SerialNumber=%d\n",
udev->descriptor.iManufacturer,
udev->descriptor.iProduct,
udev->descriptor.iSerialNumber);
show_string(udev, "Product", udev->product);
show_string(udev, "Manufacturer", udev->manufacturer);
show_string(udev, "SerialNumber", udev->serial);
}
show_string
위에 정의된 매우 간단한 함수 announce_device
로 콜론과 공백으로 구분된 인수를 인쇄합니다.
static void show_string(struct usb_device *udev, char *id, char *string)
{
if (!string)
return;
dev_info(&udev->dev, "%s: %s\n", id, string);
}
따라서 벨소리를 추가하는 것은 커널이 아닙니다.
USB 장치의 일련번호는 무엇입니까?
lsusb를 사용하여 다음을 확인할 수 있습니다.
$ lsusb -vd 0bda:57cf | grep iSerial
iSerial 2 NC2141103Q533020AALM03
좋아요, 이제 od를 통해 파이프해 보겠습니다.
$ lsusb -vd 0bda:57cf | grep iSerial | od -c
0000000 i S e r i a l
0000020 2 \a N C 2
0000040 1 4 1 1 0 3 Q 5 3 3 0 2 0 A A L
0000060 M 0 3 \n
0000064
이는 웹캠의 일련 번호에 실제로 ASCII BEL이 포함되어 있음을 나타냅니다.