저는 kernel-5.10.24를 사용하는 임베디드 Linux 시스템을 개발 중입니다.
busybox를 init로 사용하고 rootfs에 adbd를 포함한 다른 유틸리티가 있습니다. PC에서 실행하여 임베디드 시스템에 로그인한 다음 일부 작업을 반복하는 셸 스크립트를 실행할 수 있습니다
.adb shell
^C
그런데 인터럽트 스크립트를 입력했더니 실패하는 걸 발견했습니다 . ^Z
먼저 사용한 다음 kill -9 xxx
스크립트 실행을 중지 해야 합니다 .
프로세스가 언제중지됨그것을 전달 ^Z
하고 읽었고 /proc/pid_of_script/status
다음을 발견했습니다.
SigPnd: 00000000000000000000000000000000
ShdPnd: 00000000000000000000000000020000
SigBlk: 00000000000000000000000000020000
SigIgn: 00000000000000000000000000001006
SigCgt: 00000000000000000000000000020000
SignIgn은 SIGINT(2)를 차단합니다. 그런 다음 상위 프로세스와 상위 프로세스(adbd)를 확인한 결과 둘 다 신호 처리에서 SIGINT를 무시하는 것으로 나타났습니다.
adbd는 S50usb를 호출하는 /etc/init.d/rcS에 의해 시작됩니다(S50usb는 다른 스크립트도 호출함).
그런 다음 쉘이 실행된 후 /etc/inittab에서 S50usb를 시작하도록 변경했습니다. 하지만 이전과 같은 결과를 얻습니다.
스크립트 프로세스가 실행되는 동안 SigIgn을 조정하고 SIGINT가 실행을 중지할 수 있는 방법이 있는지 궁금합니다.
답변1
LL3의 의견과 답변을 바탕으로프로그램을 데몬으로 실행하는 것과 "&"를 사용하여 백그라운드로 분기하는 것의 차이점은 무엇입니까?나는 해결책을 얻었다.
adbd는 스크립트에 의해 시작되고 adbd &
백그라운드에 배치됩니다.
백그라운드 프로세스로 adbd는 SIGINT를 무시하도록 설정됩니다.
해결책은 start-stop-daemon
스크립트를 사용하여 직접 대신 스크립트에서 adbd를 시작하는 것일 수 있습니다 adbd &
.