내 프로세스가 종료되었지만 커널 알림을 이해할 수 없습니다.

내 프로세스가 종료되었지만 커널 알림을 이해할 수 없습니다.

임베디드 x86 설정에서 실행되는 사용자 정의 애플리케이션(buildroot 및 uClibc를 사용하여 구축)이 있습니다. 애플리케이션은 정상적으로 실행 중이었지만 오늘 아침에 직장에 복귀했을 때 프로세스가 종료되었고 터미널에 다음과 같은 출력이 표시되는 것을 발견했습니다.

SAK: killed process 1008 (CX_SC3): fd#4 opened to the tty
SAK: killed process 1009 (CX_SC3): fd#4 opened to the tty
SAK: killed process 1011 (CX_SC3): fd#4 opened to the tty
SAK: killed process 1012 (CX_SC3): fd#4 opened to the tty

이제 CX_SC3내 프로세스에는 여러 스레드가 있으며 그 중 하나는 /dev/ttyS0무선 모뎀을 통해 메시지를 보내기 위해 열립니다. 직렬 포트의 fd 번호는 4입니다. 내가 이해하지 못하는 것은

  1. SAK 의미
  2. 내 애플리케이션의 인스턴스는 한 번에 하나만 실행되므로 위에 나열된 PID는 내 애플리케이션에 의해 종료된 프로세스를 참조해야 합니다. 이 PID가 실제로 내 스레드 ID일 가능성이 있습니까(내 응용 프로그램은 항상 4개의 스레드를 실행하므로).
  3. 내 앱이 다른 프로세스를 종료하는 경우 내 앱도 종료되는 이유는 무엇입니까?
  4. 이 부분은 무엇을 opened to the tty의미하나요? 일부 연구에 따르면 이는 프로그램을 시작하는 데 사용하는 tty에 인터럽트 문자가 전송되는 것과 관련이 있는 것으로 나타났습니다.

어떤 이벤트가 다음 출력을 유발할 수 있습니까? 내 임베디드 설정은 매우 작으며 내 사용자 정의 응용 프로그램 외에는 거의 사용 busybox및 실행 되지 않습니다. vsftpd내 애플리케이션의 견고성은 매우 중요합니다.

편집하다:아래 의견에 대한 응답으로 이것이 SAK 감지로 인한 것이라면 실수로 이 문제를 유발할 수 있는 것이 있습니까? 직렬 포트에서 읽은 내용이 이를 트리거할 수 있습니까? 또한 내 시스템에 맞는 SAK 조합을 어떻게 찾나요? 루트 파일 시스템에 또는 파일이 없습니다 rc.sysinit.rc.local

고쳐 쓰다:나는 이 이벤트가 내 호스트가 종료된 시점을 정확하게 지적할 수 있었습니다. 내장된 대상에 직렬 데이터를 보내기 위해 호스트와 대상 장치 사이에 직렬 케이블이 있습니다. 대상을 실행 중인 상태로 두고 호스트를 종료하면 위에서 설명한 대로 애플리케이션이 종료됩니다. 호스트를 종료하기 전에 직렬 케이블을 분리하면 애플리케이션이 종료되지 않고 정상적으로 실행됩니다. 이 동작은 실행한 후에도 발생합니다.

echo 0 > /proc/sys/kernel/sysrq

조언을 따르십시오.

답변1

이 맥락에서 SAK가 실제로 의미하는 것은 다음과 같습니다.안전 주의 버튼. 표시되는 메시지는 다음에 정의된 커널 메시지입니다.드라이버/tty/tty_io.c. SAK는 콘솔에서 보안 사용자 로그인을 보장하는 키 조합입니다. Linux에서 SAK는 SAK를 호출하는 터미널에 연결된 모든 프로세스를 종료하여 이를 보장합니다. init그런 다음 신뢰할 수 있는 로그인 프로세스가 다시 시작될 것으로 예상됩니다 .getty다음에 login또는X 서버그리고디스플레이 관리자.

CX_SC3나열된 PID는 실제로 SAK에 의해 종료된 애플리케이션 스레드의 PID입니다.

fd#n opened to the tty종료되는 프로세스/스레드에 파일 설명자가 있음을 의미합니다.nSAK라는 터미널을 엽니다.

Linux에는 두 가지 방법이 있습니다.SAK에 전화하기:

  1. 통과하다마법 시스템 요청키 - 일반적으로 ++ Alt(가상 터미널) 또는 (직렬 콘솔)입니다. 귀하의 경우에는 그렇지 않습니다. 이미 마법을 비활성화하여 시도했으며 실수로 시퀀스를 보낼 가능성은 거의 없습니다.SysRqKBreakKSysRqecho 0 > /proc/sys/kernel/sysrqBreakK

  2. 정의된 키 시퀀스(가상 터미널) 또는 인터럽트 신호(직렬 콘솔)를 통해. 직렬 콘솔의 SAK 가용성이 제어됩니다 setserial.

인터럽트 신호간격 값은 문자 전송 시간(시작 비트, 정지 비트 및 패리티 비트 포함)보다 긴 기간 동안 직렬 회선을 통해 지속적으로 전송됩니다. 귀하의 경우 호스트 종료 중에 인터럽트 신호가 발생했을 가능성이 높습니다. 다음을 통해 대상 장치의 직렬 포트에서 SAK를 꺼보세요.setserial:

setserial /dev/ttyS0 ^sak

시리얼 포트를 통해 SAK 기능 상태를 확인할 수 있습니다 setserial -g /dev/ttyS0. 켜진 SAK후에 표시됩니다 Flags:. 시작 후 이 옵션을 자동으로 설정하려면 BusyBox 시스템의 시작 스크립트를 참조하세요. 일반적으로 /etc/init.d/rcS/etc/rc.d/S*/또는 확인 표시가 있습니다./etc/inittab다른 가능성을 위해.

답변2

나는 Pabuk의 답변을 통해 이 문제를 해결했습니다. SAK사용자 공간 API를 사용하여 열 때 직렬 포트에서 플래그를 설정/설정 해제 할 수 있는 코드 기반 솔루션을 stackoverflow에서 찾을 수 있습니다.사용자 공간 API를 사용하여 Linux에서 직렬 포트 SAK 옵션을 비활성화하는 방법은 무엇입니까?

관련 정보