【发布时间】:2020-02-05 17:16:58
【问题描述】:
我正在开发一个测试自动化系统,但我想出了一些行为不端的程序。对于第一个,我已经遇到了一些意想不到的行为。
trap "echo No thanks" INT
echo Let me just chill for $1 sec
sleep $1
echo All finished
观察到的行为:
- 发送 SIGINT 会导致打印“不,谢谢”,睡眠显然会立即中断,之后也会立即打印“全部完成”。
- 无论信号是单独发送还是使用键盘 ctrl+c 执行,行为都是相同的。
- 如果睡眠是后台的,我们会
wait为它观察到相同的行为。
预期行为:
- 向进程发送 SIGINT 应该会在睡眠运行期间打印“不,谢谢”,然后在睡眠结束后退出之前打印“全部完成”。
-
如果睡眠是后台的,发出键盘 ctrl+c 应该发送 SIGINT 到进程组,这将包括睡眠,所以应该过早停止它。我不知道会发生什么
问题:
- 如何获得所需的行为?
- 为什么它的行为是这样的(与我的预期不同)?
这个问题本质上是 this 的欺骗,但该答案没有令人满意的解释。
【问题讨论】:
-
你试过
echo "No thanks" && exit吗?您还可以调用一个函数,该函数将在最后回显和。有时您希望程序在捕获信号时继续运行(例如,显示信号USR1的统计信息)。 -
@Matthieu 请重新阅读问题,关键是让它不退出,但它正在意外退出
-
如果我将信号单独发送到
bash进程,直到sleep完成后我才会看到陷阱执行。 Control-C 不同,因为组中的每个进程都直接从操作系统接收信号。 -
您的预期不正确 — the trap handler will be run after the foregrounded sleep completes。此外,也许你正在杀死错误的 PID。没有人可以重现您报告的行为,下面的答案是针对您说您没有做的 Ctrl-C 案例。你能告诉我们你是如何准确地输入什么来知道要杀死的 pid,你看到了什么,以及你输入了什么是如何杀死它的吗?
-
是的,但问题是,control+c 会杀死对照组。所以
sleep也收到了SIGINT。因为sleep接收到SIGINT,所以它终止,然后因为 bash 也接收到 SIGINT,所以它运行处理程序。