我试图理解sleep
和之间的微妙之处sleep & wait
。
- 如果运行脚本
test.sh
#!/bin/bash
sleep 10000
在一个终端和ps -aef --forest
另一个终端中,然后我看到
myuser 14355 14113 0 23:26 pts/5 00:00:00 | \_ /bin/bash ./test.sh
myuser 14356 14355 0 23:26 pts/5 00:00:00 | \_ sleep 10000
sleep
如果我向进程( )发送中断kill -INT 14356
,则bash
和sleep
进程都会结束。
- 如果最后一行
test.sh
是
sleep 10000 & wait
我ps
再次奔跑,我明白了
myuser 14381 14113 0 23:31 pts/5 00:00:00 | \_ /bin/bash ./test.sh
myuser 14382 14381 0 23:31 pts/5 00:00:00 | \_ sleep 10000
如果我再次发送中断sleep
,则什么也不会发生。但是,我bash
现在可以终止进程。
https://pubs.opengroup.org/onlinepubs/009695399/utilities/trap.html说
当进入子 shell 时,未被忽略的陷阱将设置为默认操作。
在我看来,睡眠的默认操作是在中断时终止(如果我简单地sleep 10000
在一个终端中运行,然后尝试从另一个终端中断它,它就会终止)。
为什么在 2 中不能sleep
直接中断,但在 1 中可以?