如何避免ADB执行后台sleep命令获取PID时出现阻塞?
解决ADB执行后台sleep脚本阻塞的问题
方案一:修改脚本重定向输出
修改/data/local/tmp/script.sh的内容为:
sleep 100 >/dev/null 2>&1 & echo $!
执行命令adb -s <DEVICE> shell sh /data/local/tmp/script.sh即可立即获取PID,不会被sleep阻塞。
方案二:单行命令直接实现
无需脚本的话,直接用以下命令完成需求:
adb -s <DEVICE> shell 'sleep 100 >/dev/null 2>&1 & echo $!'
方案三:彻底脱离会话(可选)
如果需要避免后台sleep进程被ADB会话终止影响,可以加上disown或setsid:
- 脚本版:
sleep 100 >/dev/null 2>&1 & disown echo $! - 单行命令版:
adb -s <DEVICE> shell 'setsid sleep 100 >/dev/null 2>&1 & echo $!'
原因说明
ADB shell会维持与所有子进程的标准输入输出关联,后台运行的sleep默认仍将stdout/stderr绑定到ADB会话通道,导致ADB必须等待sleep关闭这些描述符才会结束会话,从而造成阻塞。将sleep的输出重定向到/dev/null后,切断了这种关联,ADB就能在输出PID后立即退出。
内容的提问来源于stack exchange,提问作者ANSOLO
相关产品推荐
相关产品推荐

