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

如何在捕获信号时正确等待bash子进程完成

在捕获信号时正确等待bash子进程完成的方法是使用wait命令。wait命令用于等待子进程的完成,并返回子进程的退出状态。

具体步骤如下:

  1. 在bash脚本中,使用trap命令设置信号处理函数。例如,可以使用以下命令将SIGINT信号(Ctrl+C)与一个自定义的处理函数关联起来:
  2. 在bash脚本中,使用trap命令设置信号处理函数。例如,可以使用以下命令将SIGINT信号(Ctrl+C)与一个自定义的处理函数关联起来:
  3. 在脚本中启动子进程,并将其保存在一个变量中。例如,可以使用以下命令启动一个后台进程:
  4. 在脚本中启动子进程,并将其保存在一个变量中。例如,可以使用以下命令启动一个后台进程:
  5. 在需要等待子进程完成的地方,使用wait命令等待子进程的完成。例如,可以使用以下命令等待上一步中启动的子进程完成:
  6. 在需要等待子进程完成的地方,使用wait命令等待子进程的完成。例如,可以使用以下命令等待上一步中启动的子进程完成:
  7. 在信号处理函数中,可以使用wait命令等待子进程的完成。例如,可以使用以下命令等待子进程完成并进行清理操作:
  8. 在信号处理函数中,可以使用wait命令等待子进程的完成。例如,可以使用以下命令等待子进程完成并进行清理操作:

这样,在捕获信号时,脚本会等待子进程的完成后再执行相应的操作,确保子进程的正常执行和完成。

推荐的腾讯云相关产品:无

参考链接:

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

相关·内容

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

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

8200

docker的reap问题

问题 僵尸进程 僵尸进程是指完成执行(通过exit系统调用,或运行时发生致命错误或收到终止信号所致),但在操作系统进程表中仍然有一个表项,处于“终止状态”的进程。...bash正确地reap收养的进程bash可以执行任何程序。...不过,这个办法有一个关键问题:不能正确处理信号。对bash发送一个SIGTERM信号bash会终止,但是并不会发送SIGTERM给其进程。 当bash程序终止,内核会停止整个容器和其中的进程。...一些进程会接收到SIGKILL信号,不正确地终止。SIGKILL无法被捕获,所以进程不能干净地终止。假如应用程序正在写文件;如果应用程序在写入过程中被不正确地终止,则文件可能会损坏。...Tini一般在容器中运行,用于生成进程等待它推出,reap僵尸进程,并执行信号转发。 在最新的版本中,能将退出码143重新映射为0。

1.2K30

何在容器中执行多条指令并能优雅退出

bash进程会接收SIGTERM信号,但并不会传递信号给业务进程,直到等待超时时间后收到SIGKILL信号而退出。...解决 init 可配置 TINI_KILL_PROCESS_GROUP ,配置后,SIGTREM信号将传递给进程所在进程组的所有进程(即由bash而生的进程可收到信号)。...正常启动,init作为1号进程bash进程作为1号进程,业务进程又作为bash进程进程 容器正常退出,init收到SIGTERM信号,传递信号给其进程(6号)所在进程组的所有进程(6和16...容器异常退出,业务进程(16)异常退出,bash紧随业务进程退出。 init进程接受到进程(6号bash)退出信号SIGCHILD,退出容器。...= true 如此: bash所带指令正常启动 pod退出业务进程可处理SIGTERM后很快完成容器退出

4.2K31

容器中的一号进程

Bash当作PID 1呢? 每个基础镜像都有这个是BashBash 正确地收割了采用的进程Bash 可以运行任何东西。...换句话说,给 Bash发送SIGTERM信号终止,会等待十秒钟,然后被内核强制终止包含所有进程的整个容器。这些进程通过 SIGKILL 信号不正常地终止。...因为真正想要的可能是Bash返回与的进程相同的退出代码。 请注意,我们对bash进行修改,编写一个 EXIT 处理程序,它只是向进程发送信号: #!...向进程发送信号是不够的:init 进程还必须等待进程终止,然后才能终止自己。如果 init 进程过早终止,那么所有进程都会被内核不干净地终止。...或Java中很难实现(例如,Tini可以注册为“收割者”,因此它实际上不需要作为PID 1运行来完成“僵尸进程”收割工作),但是这些功能对于一些高级应用场景来说非常有用。

1.6K60

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

从运行态到睡眠态一般是等待某事件的出现,例如等待信号通知,等待IO完成。...在当前bash环境下,处于可运行状态(即就绪态),当执行cp命令,首先fork出一个bash进程,然后在bash上exec加载cp程序,cp进程进入等待队列,由于在命令行下敲的命令,所以优先级较高...根据状态码这个"信号",父进程bash知道了进程已经终止,所以通告给内核,内核收到通知后将进程列表中的cp进程项删除。至此,整个cp进程正常完成。...当后台进程出错,或者执行完成,总之后台进程终止,父进程会收到信号。...17 当进程中断或退出,发送该信号告知父进程自己已完成,父进程收到信号将告知内核清理进程列表。

1.7K20

等待进程的那些事儿

,忽略系统自动回收已结束的进程; 当正常捕获 SIGCHLD ,使用 systemtap 是可以观察到进程向父进程发送的 SIGCHLD 信号的: 29877 cldsig...17 SIGCHLD 当忽略 SIGCHLD ,是观察不到的,只能看到父进程结束bash 发送的 SIGCHLD 信号: 29893 cldsig...组) 来等待; 可以捕获进程除结束以外的其它状态变更通知,挂起 (WUNTRACED)、继续 (WCONTINUED) 等; 可以不阻塞的测试某个子进程是否已结束 (WNOHANG); wait 函数族可被信号中断...例如 bash,它除了在主线程中同步等待前台正在运行的进程,还必需在信号处理器中异步接收后台运行进程的状态反馈,这样就不得不混合使用 wait。...在处理器中也应使用 waitpid 等待进程返回 ECHILD 错误,证明该进程是前台进程,已经被同步 wait 掉了,不需要任何处理;否则作为后台进程处理。

2.4K30

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

但有时我们会遇到一种情况: 业务逻辑处理了 SIGTERM 信号,但 Pod 停止好像没收到信号导致优雅停止逻辑不生效。.../bin/yourapp # 脚本中执行二进制 当 Pod 停止,kubelet 发送 SIGTERM 信号给容器主进程,即 shell 进程,但 shell 进程并没有自动传递信号进程的能力,...这个时候我们可以在 shell 中使用 trap 来捕获信号,当收到信号后触发回调函数来将信号通过 kill 传递给业务进程,脚本示例: #!...SIGTERM # 捕获 SIGTERM 信号并回调 handle_sigterm 函数 wait # 等待回调执行完,主进程再退出 完美方案: 使用 init 系统 前面一种方案实际是用脚本实现了一个极简的...,作为主进程 (PID 1) 在容器中启动,然后它再运行 shell 来执行我们指定的脚本 (shell 作为进程),shell 中启动的业务进程也成为它的进程,当它收到信号时会将其传递给所有的进程

2.1K51

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

但有时我们会遇到一种情况: 业务逻辑处理了 SIGTERM 信号,但 Pod 停止好像没收到信号导致优雅停止逻辑不生效。.../bin/yourapp # 脚本中执行二进制 当 Pod 停止,kubelet 发送 SIGTERM 信号给容器主进程,即 shell 进程,但 shell 进程并没有自动传递信号进程的能力,导致我们业务进程收不到信号...这个时候我们可以在 shell 中使用 trap 来捕获信号,当收到信号后触发回调函数来将信号通过 kill 传递给业务进程,脚本示例: #!...SIGTERM # 捕获 SIGTERM 信号并回调 handle_sigterm 函数 wait # 等待回调执行完,主进程再退出 完美方案: 使用 init 系统 前面一种方案实际是用脚本实现了一个极简的...,作为主进程 (PID 1) 在容器中启动,然后它再运行 shell 来执行我们指定的脚本 (shell 作为进程),shell 中启动的业务进程也成为它的进程,当它收到信号时会将其传递给所有的进程

2.7K71

Linux下进程相关知识

进程必须通过使用等待系统调用来确认进程的终止,这是为了检查进程的终止状态。...孤儿进程当父进程进程之前死亡,内核知道它不会得到一个等待调用,所以它会让这些进程成为“孤儿”,并将它们置于init(记住所有进程的父进程)的照顾下。...我们仍然希望能够看到进程是如何终止的,因此即使进程完成了,内核也会将进程变成僵尸进程进程使用的资源仍然被释放给其他进程使用,但是进程表中仍然有这个僵尸进程的条目。...当一个信号被传递进程可以做很多事情: 忽略信号捕获信号并执行特定的处理程序例程 进程可以终止,而不是正常的退出系统调用 阻塞信号,取决于信号掩码 常见的信号 每个信号都由具有符号名的整数定义,...你将看到的最常见的如下所示: R: running或runnable,它只是在等待CPU处理它 S:可中断休眠,等待一个事件完成,例如来自终端的输入 D:不间断睡眠,不能被信号杀死或中断的进程,通常要让它们消失

1.4K50

获取 NodeJS 程序退出码

这两种操作都将强制进程尽快退出,即使仍有未完全完成的异步操作挂起,包括对 process.stdout 和 process.stderr 的 I/O 操作。...// 如何正确设置退出码,同时让进程正常退出。...通过 NodeJS 的 child_process 进程获取退出码 child_process.fork() 方法是 child_process.spawn() 的特例,专门用于衍生新的 NodeJS...6 非函数的内部异常句柄:存在未捕获的异常,但内部致命异常句柄不知何故设置为非函数,无法调用。 7 内部异常句柄运行时失败:存在未捕获的异常,并且内部致命异常句柄函数本身在尝试处理抛出错误。...13 未完成的顶层等待:在顶层代码中的函数外使用了 await,但传入的 Promise 从未解决。

3.5K10

问题:Springboot框架开发的项目中会内嵌tomcat容器,在杀死进程的时候tomcat为被正常杀死,导致端口未被释放,第二次启动的时候报端口冲突。

先讲一个基本概念:如何在shell中终止一个后台进程?  kill的作用是向某个指定的进程进程组发送指定信号,从而结束该进程/进程组。...-s选项可以指定要发送的具体信号,如果没有指定,则默认发送SIGTERM(15)信号至指定进程/进程组,若进程没有捕获信号的逻辑,则SIGTERM的作用是终止进程。...若应用程序没有捕获并响应该信号的逻辑代码,则该信号的默认动作是kill掉进程。这是终止指定进程的推荐做法。...在某些情况下(进程已经hang死,无法响应正常信号),就可以使用kill -9来结束进程。...若通过kill结束的进程是一个创建过进程的父进程,则其进程就会成为孤儿进程(Orphan Process),这种情况下,进程的退出状态就不能再被应用进程捕获(因为作为父进程的应用程序已经不存在了)

61520

为什么我在容器中不能 kill 1 号进程

完成内核初始化后,boot-loader需要执行的第一个用户态进程就是init进程。 init进程的基本功能就是创建出其他进程并管理它们。...kill 1,通过kill向1号进程发送信号。在没有别的参数这个信号类型默认为SIGTERM,是可以被捕获的 SIGKILL(9) Linux 里两个特权信号之一,不能被忽略也不能被捕获。...把c程序作为1号进程就无法在容器中杀死,而go程序作为1号进程却可以。 运行 kill 1 ,希望把 SIGTERM 发送给 1 号进程,就像下图中带箭头虚线。...问题和第二个if语句有关,一旦这三个条件都被满足,那么信号就不会发送给进程。 !(force && sig_kernel_only(sig)):如果是同一个Namespace发出的信号,值为0。...Linux 有 31 个基本信号进程在处理大部分信号时有三个选择:忽略、捕获和缺省行为。其中两个特权信号 SIGKILL 和 SIGSTOP 不能被忽略或者捕获

17610

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

进程完成发出(exit)信号请求,在退出进程已经关闭或丢弃了其资源环境,剩余的部分称之为僵停(僵尸Zombie)。...父进程进程退出收到信号而被唤醒,清理剩余的结构,然后继续执行其自己的程序代码。...对于那些可以捕获信号进程就要用编号为9的kill信号,强行“杀掉”该进程。...(2)应注意,信号使进程强行终止,这常会带来一些副作用,如数据丢失或者终端无法恢复到正常状态。发送信号必须小心,只有在万不得已,才用kill信号(9),因为进程不能首先捕获它。...用户提交作业以后,当作业被调度,系统会为作业创建进程,一个进程无法完成,系统会为这个进程创建进程

3.3K10

【Linux】详解进程终止&&进程等待

操作系统发现进程(假设是进程要对数据进行修改)要对数据进行修改,且操作合法的,这是就会在内存中申请一块空间重新建立映射关系,再将父子进程该对应的映射条目都改成‘rw’,这才算完成了一次写拷贝。...2.2、进程退出的场景 进程提出的场景与三种: 1、进程代码执行完了,结果是正确的。 2、进程代码执行完了,结果不正确。 3、进程代码没有执行完,进程出异常了。...进程出异常进程的退出码是没有意义的。 第三种情况进程出异常是进程收到了操作系统发出的异常信号,每个信号都有不同的编号,不同的信号编号表示异常的原因。...进程运行完成,结果对还是不对,或者是否正常退出。...阻塞等待进程会阻塞在waitpid这里一直等待进程返回,非阻塞等待采用轮询的方法查看进程的退出信息,在轮询的间隙父进程可以继续做别的工作。

22410

Kubernetes 运维遇到的问题记录(4)

所有容器进程终止,清理 Pod 资源。 3.5. 通知 APIServer Pod 销毁完成完成 Pod 删除。 Kubernetes只负责将SIGTERM 信号给容器内主进程。...不做特别配置 shell是不会往自己的进程传递 SIGTERM 信号的,从而导致业务进程不会触发停止逻辑。...这个时候我们可以在 shell 中使用 trap 来捕获信号,当收到信号后触发回调函数来将信号通过 kill 传递给业务进程,脚本示例: #!...SIGTERM # 捕获 SIGTERM 信号并回调 handle_sigterm 函数 wait # 等待回调执行完,主进程再退出 完美方案: 使用 init 系统 前面一种方案实际是用脚本实现了一个极简的...,作为主进程 (PID 1) 在容器中启动,然后它再运行 shell 来执行我们指定的脚本 (shell 作为进程),shell 中启动的业务进程也成为它的进程,当它收到信号时会将其传递给所有的进程

92920

Linux 信号(Signal)

内核在某些情况下,也会给进程发送信号,例如当进程退出,内核给父进程发送 SIGCHLD 信号。...中断和信号通知都是在内核产生。中断是完全在内核里完成处理,而信号的处理则是在用户态完成的。...SIGHUP 运行在终端中,由 bash 启动的进程,都是 bash进程。终端退出结束时会向 bash 的每一个进程发送 SIGHUP 信号。...当用户按下 ctrl-c ,终端将发送 SIGINT 到前台进程。 SIGINT 的缺省行为是终止进程(Term),但它可以被捕获或忽略。...SIGTERM 默认行为是终止进程,但它也可以被捕获或忽略。SIGTERM 的目的是杀死进程,它允许进程有机会在终止前进行清理,优雅的退出。当我们使用 kill 命令,SIGTERM 是默认信号

92610

csapp 第八章 异常控制流 读书笔记

init进程的PID=1,是在系统启动由内核创建的,它不会终止,是所有进程的祖先。一个进程可以通过调用waitpid函数来等待它的进程终止或者停止。...参数说明: 1.判定等待集合的成员: 等待集合的成员是由参数pid来确定的 如果pid > 0,那么等待集合就是一个单独的进程,它的进程ID等于pid 如果pid = -1,那么等待集合就是由父进程的所有进程组成...8.5.3 接收信号 当内核把进程p从内核模式切换到用户模式(eg:从系统调用返回或是完成了一次上下文切换),它会检查进程p的未被阻塞的待处理信号的集合(pending & ~blocked)。...当一个进程捕获了一个类型为k的信号,会调用为信号k设置的处理程序,一个整数参数被设置为k,这个参数允许同一个处理函数捕获不同类型的信号。...eg:如果在fork调用返回,内核刚好调度父进程而不是进程运行,那么父进程就会正确地把子进程添加到作业列表中,然后进程终止,信号处理函数把该作业从列表中删除。

31760

【Linux】进程控制(创建、终止、等待)

进程是要让父进程拿到自己的退出码以及退出状态,否则就算自己被kill掉了,也是处于一种僵尸状态(Z状态)存在着,直到父进程拿到自己的退出码以及退出状态,进程才结束僵尸状态(bash进程由于bash...僵尸进程(Z) 对于父进程来说,进程的执行结果是否正确并不重要,重要的是进程的退出状态,即进程是否是正常退出。而进程的执行结果是否正确则是由程序员根据退出码自行判断。...(注意:判断退出码是否正确的前提是进程是否正常退出) 对于僵尸进程问题的解决,父进程是通过进程等待的方式,回收进程资源,获取进程退出信息,从而解决僵尸进程问题。...所谓阻塞式等待,就是父进程运行到waitpid该处的指令,不会再往后继续执行指令,而是处于阻塞状态,等到进程退出,才会继续执行后面的指令。...,也可以通过系统提供的宏来获取: WIFEXITED(status):若进程退出信号正常,则返回真,异常返回假(通常用0表示假,非0表示真) WEXITSTATUS(status):查看退出码(用户自己根据退出码来判断是否执行结果正确

3.4K40
领券