Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 为什么父bash等待子bash死亡来执行陷阱_Linux_Bash_Shell_Pid_Kill - Fatal编程技术网

Linux 为什么父bash等待子bash死亡来执行陷阱

Linux 为什么父bash等待子bash死亡来执行陷阱,linux,bash,shell,pid,kill,Linux,Bash,Shell,Pid,Kill,假设我有一个外壳和另一个外壳。 在第一个shell上运行bash:这是父bash。例如,在父bash中,我使用trap exit INT设置了一个陷阱。 然后我在这个父bash中再次运行bash,所以我得到了一个子bash,在这里我可以做任何事情。 然后,在外部shell中,如果我尝试用-INT标志终止父bash的PID,它不会做任何事情。一旦我退出子bash,它就会返回父bash并执行陷阱并立即杀死父bash 我的主要问题是,即使相应的bash打开了一些子shell,如何强制立即执行陷阱?我怎

假设我有一个外壳和另一个外壳。 在第一个shell上运行bash:这是父bash。例如,在父bash中,我使用trap exit INT设置了一个陷阱。 然后我在这个父bash中再次运行bash,所以我得到了一个子bash,在这里我可以做任何事情。 然后,在外部shell中,如果我尝试用-INT标志终止父bash的PID,它不会做任何事情。一旦我退出子bash,它就会返回父bash并执行陷阱并立即杀死父bash

我的主要问题是,即使相应的bash打开了一些子shell,如何强制立即执行陷阱?我怎样才能解决这个问题? 我不希望像-9这样残忍的执行,因为我仍然希望我的bash陷阱能够完成特定的清理工作

INT似乎并不重要。 示例:在一次shell运行中:

bash
ps
trap "echo HELLO" TERM
bash
在另一个shell中,编写:

kill -TERM (pid that you read in ps)

在您真正退出子bash之前,它不会做任何事情,因为您正在运行shell对键盘中断(SIGINT和SIGQUIT)所做的特殊处理。这些信号由终端发送到整个进程组,但通常只会终止组中的“前台”进程

这实际上的工作方式是,当shell(任何shell,而不仅仅是bash)调用子进程(任何子进程、shell或可执行文件或其他)并立即等待子进程完成(shell中的前台命令)时,它会忽略SIGINT(和SIGQUIT)信号。一旦子进程完成(这可能是由于子进程从键盘退出SIGINT信号),shell将再次成为前台,不再忽略SIGINT/SIGQUIT


这样做的好处是,您不应该将键盘控制信号用于键盘控制操作以外的其他操作。如果要终止父shell而不考虑其状态,请使用SIGTERM信号。这就是术语信号的含义。

一种解决方法是存储子外壳的参考信息和进行清理工作所需的信息。但我不想那样做。这很乏味,在父bash中,所需的所有信息都已加载到内存中,只需在陷阱中恢复执行就会方便得多。我怎么做呢?我试着用bash启动子bash&让它在后台运行,希望它能允许并行执行我的父bash,但它不起作用。INT在这里不重要,我尝试了其他信号,它们也延迟了陷阱执行。请看@CharlesDuffy,当我用bash而不是sleep执行它们的操作时:bash&wait$,然后我调用kill with-TERM信号,我得到了一个分段错误,使用-TERM并没有解决我的问题。它仍在等待子shell完成。它对我来说就像预期的那样工作——如果你看到不同的行为,你需要显示一个mvce来演示你的问题。请查看我的edit@ChrisDodd,你能提供一些支持这个答案的链接吗?这与我的经验相反,与此站点上的其他内容相反(表明当外部命令运行时,所有可捕获的信号都被延迟)。