首页
学习
活动
专区
工具
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.6K71

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 中启动业务进程也成为它进程它收到信号时会将其传递给所有的进程

2K51

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

随着时间流逝,分配给进程时间也会被逐渐消耗,分配时间消耗完毕时,内核收回此进程控制权,让下一个进程运行。...在当前bash环境下,处于可运行状态(即就绪态)时,执行cp命令时,首先fork出一个bash进程,然后在bashexec加载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.4K30

如何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

5600

dockerreap问题

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

1.2K30

Docker竟有这些不为人知bug

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

3.9K10

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状态,而系统响应变慢。

3.7K30

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 $$` =

54220

Linux下进程相关知识

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

1.6K60

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。

91910

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。

3.9K10

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

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

3.2K10

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

解释运行脚本,按 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.2K30

系统进程管理查看

命令 - 进程杀死 描述:用来在Linux杀死执行中程序或工作进程命令, kill可将指定信息送至程序,预设信息为SIGTERM(15),可将指定程序终止,若仍无法终止该程序,可使用SIGKILL...(9)信息尝试强制删除程序->程序或工作编号可利用ps指令或job指令查看 #语法 kill [信号代码] #参数 -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,因为进程已经隔离了

79820

正确使用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.4K20

【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.1K20

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 终止 进程 再次查看进程状态

20230
领券