shell A 中调用另一个 shell B 脚本,怎么一起杀死?

发布于 2022-09-11 18:27:30 字数 96 浏览 16 评论 0

我发现, 根据 shell A 的进程ID, kill 掉后, shell B 还会继续运行着.

有什么优雅的方式, 一次kill掉这种调用关系的shell呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

浅黛梨妆こ 2022-09-18 18:27:30

在启动一个脚本时,把pid记录到一个文件
杀进程时,根据记录的pid kill

土豪 2022-09-18 18:27:30

暂时找到一个个人认为比较靠谱的方式.

如何杀死父子进程

脚本层级调用的场景中, 传统的根据pid的方式kill, 若只是kill主脚本的进程, 所有里面调用的子脚本不会被kill. 除非获取所有子进程id, 逐个kill, 但是手动做这些, 那又累, 而且容易遗漏, 造成未知后果.

靠谱解决方案:

先学习下 pstree, awk.

调用层级: a.sh -> b.sh -> c.sh

# 启动 a.sh 后
[root@localhost ~]# ps -ef|grep a.sh|grep -v "grep"
root       2951   2772  0 17:31 pts/0    00:00:00 sh a.sh

# 查看进程树, 并切割
# -F"[()]" 指定按照正则 [()] 切割 pstree 的输出结果
# NF 内置变量, 表示按照 F 选项切割后的元素个数, 其中 $0 是原文
# $i 表示引用第 i 个元素
[root@localhost ~]# pstree -p 2951 | awk -F"[()]" '{for(i=0;i<=NF;i++)print $i}'
sh(2951)---sh(2952)---sh(2954)---sleep(2955)
sh
2951
---sh
2952
---sh
2954
---sleep
2955

上面第二行指令改进后:

pstree -p 2951 | awk -F"[()]" '{for(i=0;i<=NF;i++)if($i~/^[0-9]+$/)print $i}'

输出:

2951
2952
2954
2955

这就是拿到了主进程及其所有子进程pid了.

使用_kill_拿到的所有pid, 就可以一次性kill了

kill -9 `pstree -p 3254 | awk -F"[()]" '{for(i=0;i<=NF;i++)if($i~/^[0-9]+$/)print $i}'`

或:

pstree -p 3281 | awk -F"[()]" '{for(i=0;i<=NF;i++)if($i~/^[0-9]+$/)print $i}'|xargs kill -9
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文