当前位置: 首页 > 知识库问答 >
问题:

为什么bash脚本在接收Sigterm时不等待其子进程完成就退出父脚本?

荀嘉熙
2023-03-14
trap exit_gracefully TERM

exit_gracefully() {
    echo "start.sh got SIGTERM"
    echo "Sending TERM to child_process_1_pid: ${child_process_1_pid}"
    echo "Sending TERM to child_process_2_pid: ${child_process_2_pid}"
    echo "Sending TERM to child_process_3_pid: ${child_process_3_pid}"
    kill -TERM ${child_process_1_pid} ${child_process_2_pid} ${child_process_3_pid}
}

consul watch -http-addr=${hostIP}:8500 -type=key -key=${consul_kv_key} /child_process_1.sh 2>&1 &
child_process_1_pid=$!

/child_process_2.sh &
child_process_2_pid=$!

/child_process_3.sh &
child_process_3_pid=$!

/healthcheck.sh &

/configure.sh

# sleep 36500d &
# wait $!

wait ${child_process_1_pid} ${child_process_2_pid} ${child_process_3_pid}

echo 'start.sh exiting'

start.sh是父脚本。当SIGTERM被捕获时,它会被转发到其子进程的3个。

为什么即使我在任一情况下等待3个pid(子进程)也存在这种差异?为什么我在等待3个pids时需要睡眠?

共有1个答案

逑禄
2023-03-14

接收信号将导致正在执行的任何<code>等待</code>命令返回。

这是因为信号的目的是中断进程当前正在做的任何事情。

您看到的所有效果都是当前< code>wait返回、处理程序运行以及脚本从< code>wait退出的地方继续运行的结果。

 类似资料:
  • 在退出脚本(TCL/Bash)之前,如何确保所有后台进程都已完成执行。 我想把我所有的后台进程PID写到一个pidfile中。然后在最后pgrep PID file,看看在我退出之前是否还有进程在运行。 有什么更简单的方法吗?而TCL有没有具体的办法做到这一点呢?

  • 我试图测量我的过程完成所需的时间,如下所示: 但是,它会在脚本运行时立即打印,然后其他进程开始运行,因此时间不考虑进程的持续时间。我怎么能让它等到进程完成,然后打印持续时间? 我的流程是这样的,这里有一个例子:

  • 这是 parent.sh: 这是child.sh: 如果像这样在终端中运行父脚本... ...大约3秒后,通过击键发出中断。几秒钟后检查out.txt时,它看起来像... ...从而指示父项和子项在(击键)中断时结束。通过实时检查 并查看脚本进程在中断之前存在并在中断之后消失来证实这一点。 如果父脚本被cron像这样调用... ...out.txt的内容总是... ...从而表明至少子进程没有在(

  • 我在blender中有一个python脚本 我试着用通勤,但还是没用: 此shell脚本在MacOS上非常有效(在更改路径后),并且在使用时会等待 但是在Windows上,我在Blender中运行下面的python脚本,然后一旦它到达子进程行就会打开并运行shell脚本,而Blender不等待它完成,它只在控制台中打印而不等待Git Bash完成。有人帮忙吗?

  • 问题内容: 对于子进程,和函数可用于暂停当前进程的执行,直到子进程退出。但是此功能不能用于非子进程。 是否有另一个函数可以等待任何进程的退出? 问题答案: 什么都不等于。通常的做法是使用轮询,寻找返回值-1和的,表明进程已经一去不复返了。

  • 我正试图按照以下说明为Dash生成文档集:http://kapeli.com/docsets.问题是,脚本在wget之后不会继续,并且似乎不会抛出任何错误。当我把脚本复制到终端时,一切都很好。 我使用的是MacOS 10.8.4和默认的bash。 我查看了其他帖子,比如我的shell脚本在exec之后停止,但我没有在这里使用exec。 为什么脚本退出?