首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当子进程重复派生并kill -9时,如何终止bash脚本上的背景子进程

当子进程重复派生并kill -9时,要终止bash脚本上的背景子进程,可以使用以下方法:

  1. 使用trap命令:在bash脚本中,可以使用trap命令来捕获并处理信号。可以在脚本中设置一个trap函数,当接收到SIGTERM信号时,执行相应的操作来终止子进程。示例代码如下:
代码语言:bash
复制
#!/bin/bash

# 定义一个函数来终止子进程
function terminate_child_process {
    echo "Terminating child process..."
    # 终止子进程的命令
    kill <child_process_pid>
}

# 设置trap函数,当接收到SIGTERM信号时调用terminate_child_process函数
trap terminate_child_process SIGTERM

# 启动子进程
<command_to_start_child_process> &

# 等待子进程结束
wait

在上面的代码中,<child_process_pid>是子进程的进程ID,<command_to_start_child_process>是启动子进程的命令。

  1. 使用pgrep和pkill命令:pgrep命令用于根据进程名或其他条件查找进程的进程ID,pkill命令用于发送信号给匹配的进程。可以在脚本中使用pgrep命令找到子进程的进程ID,并使用pkill命令发送SIGTERM信号来终止子进程。示例代码如下:
代码语言:bash
复制
#!/bin/bash

# 查找子进程的进程ID
child_process_pid=$(pgrep -f "<child_process_name>")

# 终止子进程
if [ -n "$child_process_pid" ]; then
    echo "Terminating child process..."
    # 终止子进程的命令
    pkill -TERM -P $child_process_pid
fi

在上面的代码中,<child_process_name>是子进程的名称或关键字。

  1. 使用ps和kill命令:ps命令用于查看进程状态,kill命令用于发送信号给进程。可以在脚本中使用ps命令找到子进程的进程ID,并使用kill命令发送SIGTERM信号来终止子进程。示例代码如下:
代码语言:bash
复制
#!/bin/bash

# 查找子进程的进程ID
child_process_pid=$(ps -ef | grep "<child_process_name>" | grep -v grep | awk '{print $2}')

# 终止子进程
if [ -n "$child_process_pid" ]; then
    echo "Terminating child process..."
    # 终止子进程的命令
    kill -TERM $child_process_pid
fi

在上面的代码中,<child_process_name>是子进程的名称或关键字。

以上是终止bash脚本上的背景子进程的几种常见方法。根据具体情况选择适合的方法来终止子进程。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

kubernetes 实用技巧: 在 SHELL 中传递信号

本文摘自 kubernetes 学习笔记 背景 在 Kubernetes 中,Pod 停止时 kubelet 会先给容器中的主进程发 SIGTERM 信号来通知进程进行 shutdown 以实现优雅停止.../bin/yourapp # 脚本中执行二进制 当 Pod 停止时,kubelet 发送 SIGTERM 信号给容器主进程,即 shell 进程,但 shell 进程并没有自动传递信号给子进程的能力,导致我们业务进程收不到信号...这个时候我们可以在 shell 中使用 trap 来捕获信号,当收到信号后触发回调函数来将信号通过 kill 传递给业务进程,脚本示例: #!..." kill -SIGTERM $pid1 $pid2 # 传递 SIGTERM 给业务进程 wait $pid1 $pid2 # 等待所有业务进程完全终止 } trap handle_sigterm...,作为主进程 (PID 1) 在容器中启动,然后它再运行 shell 来执行我们指定的脚本 (shell 作为子进程),shell 中启动的业务进程也成为它的子进程,当它收到信号时会将其传递给所有的子进程

2.8K71

kubernetes 实用技巧: 在 SHELL 中传递信号

背景 在 Kubernetes 中,Pod 停止时 kubelet 会先给容器中的主进程发 SIGTERM 信号来通知进程进行 shutdown 以实现优雅停止,如果超时进程还未完全停止则会使用 SIGKILL.../bin/yourapp # 脚本中执行二进制 当 Pod 停止时,kubelet 发送 SIGTERM 信号给容器主进程,即 shell 进程,但 shell 进程并没有自动传递信号给子进程的能力,...这个时候我们可以在 shell 中使用 trap 来捕获信号,当收到信号后触发回调函数来将信号通过 kill 传递给业务进程,脚本示例: #!..." kill -SIGTERM $pid1 $pid2 # 传递 SIGTERM 给业务进程 wait $pid1 $pid2 # 等待所有业务进程完全终止 } trap handle_sigterm...,作为主进程 (PID 1) 在容器中启动,然后它再运行 shell 来执行我们指定的脚本 (shell 作为子进程),shell 中启动的业务进程也成为它的子进程,当它收到信号时会将其传递给所有的子进程

2.2K51
  • 100个Linux命令(7)-进程管理

    随着时间的流逝,分配给进程的时间也会被逐渐消耗,当分配时间消耗完毕时,内核收回此进程的控制权,并让下一个进程运行。...在当前bash环境下,处于可运行状态(即就绪态)时,当执行cp命令时,首先fork出一个bash子进程,然后在子bash上exec加载cp程序,cp子进程进入等待队列,由于在命令行下敲的命令,所以优先级较高...当后台进程出错,或者执行完成,总之后台进程终止时,父进程会收到信号。...但从执行bash命令后进入了新的shell环境来看,它有其父bash进程,所以它算是进入了子shell。 (3)执行shell脚本:因为脚本中第一行总是"#!...如果在特殊情况下,子进程终止了,但父进程没收到SIGCHLD信号,没收到这信号的原因可能是多种的,不管如何,此时子进程已经成了永存的僵尸,能轻易的被ps或top捕捉到。

    1.7K20

    linux的进程介绍与前后台任务切换

    为了操作系统可管理这个进程,因此进程有给予执行者的权限/属性等参数,并包括程序所需要的脚本与数据或文件数据等,最后再给予一个 PID 。...此外,在bash入门上的内容我们也探讨过环境变量的继承问题,子进程可以取得父进程的环境变量! 我们来进行底下的练习,以了解什么是子进程/父进程。...范例二:找出目前的 bash 环境下的背景工作,并将该工作『正常终止』掉。...您可以使用 kill -l 来查阅! #不过在这个案例中, vim 的工作无法被结束喔!因为他无法透过 kill 正常终止的意思!...因为你知道如何正常结束该进程不是吗? 通常使用 -9 是因为某些程序你真的不知道怎 么透过正常手段去终止他,这才用到 -9 的! 其实,kill 的妙用是很无穷的啦!

    1.5K30

    如何在Bash中等待多个子进程完成,并且当其中任何一个子进程以非零退出状态结束时,使主进程也返回一个非零的退出码?

    问题 如何在 Bash 脚本中等待该脚本启动的多个子进程完成,并且当这其中任意一个子进程以非零退出码结束时,让该脚本也返回一个非零的退出码? 简单的脚本: #!.../bin/bash for i in `seq 0 9`; do calculations $i & done wait 上述脚本将会等待所有 10 个被创建的子进程结束,但它总会给出退出状态 0...我应该如何修改这个脚本,使其能检测到被创建子进程的退出状态,并且当任何子进程以非零代码结束时,让脚本返回退出码 1?.../usr/bin/env bash # 这是一个特殊的 sleep 函数,它将睡眠的秒数作为"错误代码" # 或"返回代码"返回,以便我们可以清楚地看到,实际上 # 我们在每个进程完成时确实获取了它的返回代码...3") num_procs=${#procs[@]} # 数组中元素的个数 echo "num_procs = $num_procs" # 作为子进程运行命令并把 pid 存储到数组中 pids

    11500

    docker的reap问题

    与正常进程不同,kill命令对僵尸进程无效。孤儿进程不同于僵尸进程,其父进程已经死掉,但孤儿进程仍能正常执行,并不会变为僵尸进程,因为init进程会收养并wait其退出。...reap僵尸进程的方式是通过kill命令手工向其父进程发送SIGCHLD信号,如果其父进程仍然拒绝reap僵尸进程,则终止父进程,使得init进程收养僵尸进程。...假设容器中跑一个Web服务器,这个服务器运行bash编写的CGI脚本,脚本中调用了grep。Web服务器发现脚本执行超时,杀掉了它,但是grep进程没有受到影响并继续运行。...解决办法 bash 是否已经有现成,流行的软件可以做到这一点呢?还真有,这就是bash。bash会正确地reap收养的子进程。bash可以执行任何程序。...对bash发送一个SIGTERM信号,bash会终止,但是并不会发送SIGTERM给其子进程。 当bash程序终止时,内核会停止整个容器和其中的进程。一些进程会接收到SIGKILL信号,不正确地终止。

    1.2K30

    Docker竟有这些不为人知的bug

    这些程序又可能会派生出它们自己的子进程。 ? 这一部分并没有什么问题。但问题在于当一个进程终止时,会发生什么?...在上例中,操作系统会在 bash 进程终止时发送 SIGCHLD 信号以唤醒 sshd 进程,其在接收到信号后就“收割”掉了此子进程。 ?...但还有一种特殊情况——如果父进程终止了,无论是正常的(程序逻辑正常终止),还是用户操作导致的(比如用户杀死了该进程)——子进程会如何处理?...举一个相对复杂地例子,我们的容器是一个 web 服务器,需要去跑一段基于 bash 的 CGI 脚本,而该脚本又会去调用 grep 程序。...当我们运行别人的代码时,我们如何确保这些程序*并不会*派生出子进程并因而堆积大量的“僵尸进程”?唯独仅有我们运行着自己的代码,同时还对所有的依赖包和依赖包的依赖包做严格地审查,才能杜绝这种问题。

    4.1K10

    Docker stop或者Docker kill为何不能停止容器

    2、在上一步中,如果等待超时,那么Docker将使用Docker kill 方式试图终止容器 二、Docker Kill主要流程 1.Docker引擎通过containerd使用SIGKILL发向容器主进程...pid=1的进程,不能被sigterm、sigkill、sigint终止 进程组首进程退出后,子进程收到sighub 在bash shell里可以通过trap命令捕获发往shell的信号,如果docker...放在这里是因为,trap命令只能等前台运行的命令结束后才能处理信号,但是wait命令会在收到信号后立即退出,所以将命令后台化以后加wait,可以保证脚本对信号的即时响应。...从上面解释Docker kill第二步中可以看到一旦容器中主进程或者子进程处于D状态,那么Docker将等待,一直等到所有容器主进程和其子进程都退出后才返回,那么此时Docker kill就卡住了。...二、问题解释 当出现问题时刻,宿主机上发现大量的stress进程(实际是容器的进程)处于D状态,而系统响应变慢。

    4K30

    shell变量详解

    在这个shell中,可以使用shell命令或声明变量,也可以 创建并运行 shell脚本程序。 运行脚本时: 2) 运行shell脚本程序时,系统将创建一个子shell。...当一个脚本程序运行完毕,它的脚本shell将终止,可以返回到执行该脚本 之前的shell。...从这种意义上来说,用户可以有许多 shell,每个shell都是由某个shell(称为父shell)派生的。 在子shell中定义的变量只在该子shell内有效。...:上一条命令执行后返回的状态,当返回状态值为0时表示执行正常,非0值表示执行异常或出错 若退出状态值为0,表示命令运行成功 若退出状态值为127,表示command not found 若退出状态值为...126,表示找到了该命令但无法执行(权限不够) 若退出状态值为1&2,表示没有那个文件或目录 $$:当前所在进程的进程号 echo $$ eg:kill -9 `echo $$` =

    58820

    Linux下进程相关知识

    bash shell的PID是ps l命令的PPID。 当系统启动时,内核创建了一个名为init的进程,它的PID为1。除非系统关闭,否则无法终止init进程。...init将最终为这些孤儿执行等待系统调用,以便它们可以终止。 僵尸进程当子进程终止而父进程还没有调用wait时会发生什么?...我们仍然希望能够看到子进程是如何终止的,因此即使子进程完成了,内核也会将子进程变成僵尸进程。子进程使用的资源仍然被释放给其他进程使用,但是进程表中仍然有这个僵尸进程的条目。...kill 12345 12345是要终止的进程的PID。默认情况下,它发送一个TERM信号。SIGTERM信号被发送到进程,进程释放其资源并保存其状态来请求终止进程。...还可以使用kill命令指定一个信号: kill -9 12345 这将运行SIGKILL信号并终止进程。

    1.4K50

    容器中的一号进程

    如何理解 init 进程? linux 进程在树中排序。每个进程都可以产生子进程,并且除了最顶层的进程之外,每个进程都有一个父进程。...把Bash当作PID 1呢? 每个基础镜像都有这个是Bash 。Bash 正确地收割了采用的子进程。Bash 可以运行任何东西。...如果程序出了bug退出了,Bash会退出,退出代码为0,而进程实际上崩溃了(但0表示“一切正常”;这将导致Docker或者k8s上重启策略不符合预期)。...向子进程发送信号是不够的:init 进程还必须等待子进程终止,然后才能终止自己。如果 init 进程过早终止,那么所有子进程都会被内核不干净地终止。...,在Bash或Java中很难实现(例如,Tini可以注册为“子收割者”,因此它实际上不需要作为PID 1运行来完成“僵尸进程”收割工作),但是这些功能对于一些高级应用场景来说非常有用。

    1.8K60

    Tomcat 进程意外突崩,元凶居然是它...

    这种情况下,如果用户直接关闭ssh终端的窗口(用鼠标或快捷键),则java进程也会退出。而如果先ctrl-c终止test.sh进程,然后再关闭ssh终端的话,则java进程不会退出。...当catalina.sh自身进程退出后,java进程的ppid变成了1 花了很多的时间猜测可能是OS层面的原因,后来发现并没有关系。...春节后回来让少明和涧泉也一起分析这个问题,因为他们有c的背景,对系统底层知道的多一些,用了大半天时间,不断猜测和验证,最后确认了是Shell的原因。...这说明shell对signal_handler做手脚是在执行用户逻辑之前,也就是脚本在fork出子进程的时候就设置了。...把SIGHUP传递给bash进程后,bash会把SIGHUP传递给它的子进程,并且对于其子进程test.sh,bash还会对test.sh的进程组里的成员都传播一遍SIGHUP。

    1.1K10

    Tomcat进程意外退出,元凶居然是他...

    这种情况下,如果用户直接关闭ssh终端的窗口(用鼠标或快捷键),则java进程也会退出。而如果先ctrl-c终止test.sh进程,然后再关闭ssh终端的话,则java进程不会退出。...当catalina.sh自身进程退出后,java进程的ppid变成了1 花了很多的时间猜测可能是OS层面的原因,后来发现并没有关系。...春节后回来让少明和涧泉也一起分析这个问题,因为他们有c的背景,对系统底层知道的多一些,用了大半天时间,不断猜测和验证,最后确认了是Shell的原因。...这说明shell对signal_handler做手脚是在执行用户逻辑之前,也就是脚本在fork出子进程的时候就设置了。...把SIGHUP传递给bash进程后,bash会把SIGHUP传递给它的子进程,并且对于其子进程test.sh,bash还会对test.sh的进程组里的成员都传播一遍SIGHUP。

    4.1K10

    linux进程管理:进程,程序,线程 & 9个进程管理工具 & 作业控制

    fork复制的内容包括父进程的数据和堆栈段以及父进程的进程环境。父进程终止子进程自然终止。 子进程继承父进程的安全性身份、过去和当前的文件描述符、端口和资源特权、环境变量,以及程序代码。...当子进程完成时发出(exit)信号请求,在退出时,子进程已经关闭或丢弃了其资源环境,剩余的部分称之为僵停(僵尸Zombie)。...kill [选项] [进程id] -l :信号,若果不加信号的编号参数,则使用“-l”参数会列出全部的信号名称 **-a :**当处理当前进程时,不限制命令名和进程号的对应关系 **-p :**指定kill...如果没有信号号码,kill命令就会发出终止信号(15),这个信号可以被进程捕获,使得进程在退出之前可以清理并释放资源。也可以用kill向进程发送特定的信号。...要撤销所有的后台作业,可以输入killall 或者 kill 0 。因为有些在后台运行的命令会启动多个进程,跟踪并找到所有要杀掉的进程的PID是件很麻烦的事。

    3.5K10

    系统进程管理查看

    命令 - 进程杀死 描述:用来在Linux杀死执行中的程序或工作进程的命令, kill可将指定的信息送至程序,预设的信息为SIGTERM(15),可将指定程序终止,若仍无法终止该程序,可使用SIGKILL...(9)信息尝试强制删除程序->程序或工作的编号可利用ps指令或job指令查看 #语法 kill [信号代码] 进程PID/作业识别号> #参数 -a:当处理当前进程时,不限制命令名和进程号的对应关系...是345,现在使用kill命令来终止该进程. #345 1 00:00:00 find / -name foxy.jpg kill 345 kill -l 223 #重启进程 kill -9 2236...,则子进程的父进程就会更改为init即pid为1 3)kill命令的默认不带参数发生的信号SIGTERM它让程序友好的退出 ,当程序未退出时,可以使用kill -9强制退出; pkill 命令 - 结束一个进程组.../unshare -m /bin/bash $ readlink /proc/$$/ns/mnt mnt:[4026532325] # 5.进程fork一个新的子进程有新的pid,因为子进程已经隔离了

    89720

    【Linux】Linux进程的理解 --- 冯诺依曼体系、进程描述符、状态、优先级、切换…

    main() 6 { 7 // 创建子进程 -- fork是一个函数 -- 函数执行前:只有一个父进程(bash派生的)-- 函数执行后:就会有父进程和父进程创建的子进程。...下面的7088进程的父进程就是1492,1492实际上就是bash,7088的子进程是7089,这个进程就是fork函数创建出来的子进程,这个子进程的父进程是7088,也就是bash的子进程,所以7088...> 4 5 int main() 6 { 7 // 创建子进程 -- fork是一个函数 -- 函数执行前:只有一个父进程(bash派生的)-- 函数执行后:就会有父进程和父进程创建的子进程...后台程序在运行的时候,shell命令行可以继续获取命令行解析,但无法通过ctrl+c将进程终止掉,需要通过kill指令 + -9信号才可以将进程终止掉,也就是杀掉进程。...同样挂起是未知的,这完全取决于OS,不同的OS不一定将挂起暴露出来给你) 1. S状态是浅度睡眠状态,是可以被终止的,通过ctrl+c或kill -9 pid两种方式进行分别进行前后台终止。

    1.2K20

    实验(十)任务管理、进程管理

    解释运行脚本,按 Ctrl Z 中止(暂停)该进程并放入后台,然后用job命令查看后台的任务。 图片 使用fg命令将后台暂停的任务恢复到前台运行。 再次按 Ctrl Z 中止该进程并放入后台。...86,自己用命令的时候要改成上一步看到的PID 执行top命令,并使其在后台运行,可以通过 jobs 命令看到多出了一条新的任务记录,显然是top命令对应的任务: 图片 使用 fg 命令恢复带“+”号的...杀灭进程(一) 使用 kill 命令可以终止进程, -l 选项表示列出全部信号名称。kill命令实际上是向进程发送信号,信号有很多种,对应多种用途。...若不指定信号参数,将发送 SIGTERM(15) 终止指定进程。 kill命令可以使用 -KILL 选项强制结束进程,对应的信号为 SIGKILL(9) 。...图片 (4)使用kill命令终止httpd的一个子进程(668号进程) kill 668 图片 (5)重启httpd的主进程(注意参数是阿拉伯数字1) kill -1 663 图片 (6)使用 killall

    1.3K30

    正确的使用python调用shell的姿势

    python天生的优势,用它来开发一些devops的自动化作业是非常方便的,当然在linux上,一般我们用shell就能写一些简单的自动化脚本,但如果自动化作业复杂的话,使用shell脚本就很难搞定了,...一方面shell脚本量变大就会比较难以工程化,维护和阅读,另外一个重要的原因是shell不具备正经编程语言所具备的丰富的一些类库,比如说map类型必须得bash版本4.x以上才有,或者有序list什么的也没有...模块允许我们启动一个新进程,并连接到它们的输入/输出/错误管道,从而获取返回值。...wait(timeout): 等待子进程终止。communicate(input,timeout): 和子进程交互,发送和读取数据。send_signal(singnal): 发送信号到子进程 。...terminate(): 停止子进程,也就是发送SIGTERM信号到子进程。kill(): 杀死子进程。发送 SIGKILL 信号到子进程。

    7.5K20

    Linux进程学习【进程状态】

    不一定在 CPU 上运行 ️睡眠 S 睡眠 S 的本质就是 进程阻塞,表示此时进程因等待某种资源而暂停运行;睡眠 S 又称为可中断休眠,当 进程 等待时间过长时,我们可以手动将其关闭,应用卡死后强制关闭也是这个道理...还有一种方式终止进程:kill kill -9 PID 终止进程,当进程在后台运行时(状态不加 +),我们是无法通过 ctrl+c 终止的,但 kill 指令可以终止 ️休眠 D 还存在一种特殊睡眠状态...恢复运行,恢复后的 进程 在后台运行 注意: 进程 在后台运行时,是无法通过 ctrl+c 指令终止的,只能通过 kill -9 PID 终止 在 gdb 中调试代码时,打断点实际上就是 使...僵尸 T 状态 通俗来说,僵尸状态 是给 父进程 准备的 当 子进程 被终止后,会先维持一个 僵尸 状态,方便 父进程 来读取到 子进程 的退出结果,然后再将 子进程 回收 单纯的在 bash 环境下终止...<< endl; sleep(1); } } return 0; } 此时输入指令 kill -9 PID 即 kill -9 28315 终止 子进程 再次查看进程状态

    23730
    领券