linux - 如何杀死陷阱中的进程组?
问题描述
在 bash 脚本中,我通常使用陷阱来清理生成的进程:
function cleanup()
{
jobs -l
jobs -p | xargs -r -I {} kill -TERM {}
jobs -l
echo "do something after kill all jobs."
}
trap cleanup EXIT
但是,这不适用于进程组:
function cleanup()
{
jobs -l
jobs -p | xargs -r -I {} kill -TERM {}
jobs -l
echo "do something after kill all jobs."
}
trap cleanup EXIT
(sleep 100 | tee /tmp/sleep_test.log) | tee sleep_test2.log &
ps -ax -o pid,pgid,ppid,args | grep sleep
jobs -l
sleep 1
jobs -p
发出进程组的 ppid 和进程组的进程(sleep 100 | tee ...)
不能tee ...
像上面那样被杀死。它需要做kill -TERM -PGID
。有什么简单的方法可以让作业输出进程组 PGID?或者是否有任何命令可以通过 PPID 和具有统一接口的进程 PID 杀死进程组?
更新:
kill -TERM 0
在这里不起作用,因为它也会杀死自己。但是在杀死所有工作之后我仍然需要做一些事情。
解决方案
我发现的唯一方法是直接杀死子进程。
#!/usr/bin/env bash
function cleanup()
{
jobs -l
for p in $(jobs -p); do
kill $(pgrep -P $p)
done
jobs -l
echo "do something after kill all jobs."
}
trap cleanup EXIT
(sleep 100 | tee /tmp/sleep_test.log) | tee sleep_test2.log &
ps -ax -o pid,pgid,ppid,args | grep sleep
jobs -l
sleep 1
我试图杀死 PGID,但这对我不起作用。
推荐阅读
- javascript - 如何将 input="date" 表单中的数据提交给 JS 函数?
- ios - 从 .xib 文件 swift 导航到 View Controller
- python - 双曲螺旋(第一次用 ThinkPython 学习)
- java - 随时间改变球体颜色(处理)
- python - python中的round方法出现错误(AttributeError:模块'math'没有属性'round')
- python - 为什么我会收到 FileNotFoundError?
- javascript - 使用 ramda 在嵌套对象中进行数组过滤
- python - ModuleNotFoundError in Python project
- ruby-on-rails - Docker 应用程序和 localhost 应用程序之间的通信
- python - 在 vscode vs 交互式 shell 中导入 python 模块