如何让adb logcat流在grep匹配首个结果后终止进程?
解决adb logcat在grep匹配后不终止的问题
当你执行MY_VARIABLE=$(adb logcat | grep -m 1 'my variable (.*)')时,grep找到首个匹配项会退出,但adb logcat可能因忽略SIGPIPE信号继续运行,以下是几种直接有效的解决方法:
方法1:匹配后直接杀掉adb进程
利用当前shell的PID定位并终止目标adb子进程,命令如下:
MY_VARIABLE=$(adb logcat | grep -m 1 'my variable (.*)'); pkill -P $$ adb
$$代表当前执行命令的shell进程ID-P $$指定只杀掉父进程为当前shell的adb进程,避免误杀其他adb实例
方法2:捕获adb PID并主动终止
通过子shell和文件描述符传递输出,匹配完成后直接终止adb进程:
(adb logcat & PID=$!; grep -m 1 'my variable (.*)' <&3; kill $PID) 3<&0
- 启动adb后立即记录其PID到变量
$PID - 用文件描述符3传递adb的输出给grep,规避管道关闭引发的信号异常
- grep匹配完成后执行
kill $PID直接终止adb
方法3:通过进程组批量终止
将adb和grep归入同一进程组,匹配完成后向整个进程组发送终止信号:
set -m MY_VARIABLE=$(adb logcat | grep -m 1 'my variable (.*)') kill -- -$! set +m
set -m开启作业控制,让管道内的进程属于同一个进程组kill -- -$!向最后一个后台进程的进程组发送终止信号,会连带终止adbset +m关闭作业控制,恢复shell默认行为
内容的提问来源于stack exchange,提问作者Gabriel Furstenheim
相关产品推荐
相关产品推荐

