如何在Pod中中断子命令且不终止整个执行流程?
问题描述
我有一个Kubernetes Job的YAML配置(Pod仅包含一个容器),容器通过bash -c执行一串串联的子命令,配置如下:
apiVersion: batch/v1 kind: Job metadata: name: t-j namespace: tom # job and pvc should be in the same namespace spec: template: metadata: labels: app: test-job spec: containers: - name: test-job image: <URL>/tom/test:v001 command: ["bash", "-c", "tail /proc/cpuinfo -n 28 &>> job.log; python3 setup_util_cpp.py build_ext --inplace &>> job.log; python3 script_01.py &>> job.log; python3 script_02.py &>> job.log; echo '--------------Purpose: test ----------------' &>> job.log; mkdir result ; mv *.csv result; mv job.log result; tar -cjf result.bz2 result/ ; aws s3 cp --endpoint http://<another URL> /result.bz2 s3://mybucket01/ --no-progress --only-show-errors"] resources: <some other specifications>
其中子命令python3 script_01.py已运行数日,我不需要该脚本的结果,希望在不终止整个执行流程的前提下终止这个子命令,继续执行后续的其他子命令。
我尝试过以下操作但均无效:
- 执行
docker kill --signal='SIGTERM' test-job,报错:Error: no container with name or ID "test-job" found: no such container docker container ls返回空结果kubectl get pods能查到Podt-j-abcde,执行docker kill --signal='SIGTERM' t-j-abcde也无效
注:镜像基于Ubuntu 22.04,使用的容器工具为podman 4.6.1
解决方案
步骤1:进入目标Pod的容器内部
直接使用kubectl命令进入容器(因为你用的是podman,docker命令无法识别其容器):
kubectl exec -it -n tom t-j-abcde -- bash
如果容器内没有bash,可替换为sh尝试。
步骤2:定位python3 script_01.py的进程ID
进入容器后,执行以下命令查找目标进程:
ps aux | grep "python3 script_01.py"
输出结果中第二列的数字就是该进程的PID。
步骤3:终止目标进程,触发后续命令执行
由于你的所有命令是通过bash -c用分号串联的,bash默认会等待前一个命令执行完成(无论正常退出还是被强制终止)后,自动执行下一个命令。直接终止script_01.py的进程即可:
# 先尝试温和终止 kill <PID> # 如果上述命令无效,强制终止 kill -9 <PID>
为什么之前的操作无效?
- 你使用
docker命令操作,但实际容器工具是podman,两者的容器命名空间不互通,因此找不到目标容器 - 直接
kill整个Pod/容器会终止所有进程,不符合你保留后续命令执行的需求,必须进入容器单独终止目标进程
内容的提问来源于stack exchange,提问作者cat
相关产品推荐
相关产品推荐

