我正在开发一个嵌入式 Linux 系统,它使用 kernel-5.10.24。
它使用 busybox 作为 init,并在 rootfs 中具有其他实用程序,包括 adbd。
我可以adb shell
从 PC 运行来登录嵌入式系统,然后我启动一个 shell 脚本来循环执行某些操作。
但我发现当我输入^C
中断脚本时,它失败了。我必须^Z
先使用,然后kill -9 xxx
停止脚本运行。
当过程是停止了通过^Z
,它读取了它/proc/pid_of_script/status
,我发现了以下内容,
SigPnd: 00000000000000000000000000000000
ShdPnd: 00000000000000000000000000020000
SigBlk: 00000000000000000000000000020000
SigIgn: 00000000000000000000000000001006
SigCgt: 00000000000000000000000000020000
SigIgn 屏蔽了 SIGINT (2)。然后我检查了它的父进程和祖父进程(adbd),我发现它们都忽略了信号处理中的SIGINT。
adbd 由 /etc/init.d/rcS 启动,它调用 S50usb(S50usb 还调用另一个脚本)。
然后我更改为在shell运行后在/etc/inittab中启动S50usb。但我得到了和以前一样的结果。
我想知道是否有办法在运行时调整脚本进程的SigIgn,然后SIGINT可以停止其运行?
答案1
根据 LL3 的评论和答案将程序作为守护进程运行和使用“&”将其分叉到后台有什么区别?我得到了解决方案。
adbd 由脚本启动adbd &
,并将其置于后台。
作为后台进程,adbd 已设置为忽略 SIGINT。
解决方案可能是使用start-stop-daemon
script 在脚本中启动 adbd,而不是adbd &
直接使用。