如何让 ctrl+c /not/ 中断 while 循环?

如何让 ctrl+c /not/ 中断 while 循环?

给定这个循环:

while sleep 10s ; do
  something-that-runs-forever
done

当我按 Ctrl+C 时,整个 while 循环会被中断。我想做的是中断“某事”进程,等10秒过去,然后重新启动“某事”。

如何使 ctrl+c 只影响“某物”,而不影响 while 循环?

编辑:“中断”与 SIGINT 相同。杀死。中止。终止。不是“暂停”中的“中断”。

答案1

如果你只是trap SIGINT为了某件事,它应该会起作用。喜欢:true)。

#!/bin/sh
trap ":" INT    
while sleep 10s ; do
    something-that-runs-forever
done

中断something...不会使 shell 现在退出,因为它忽略了该信号。但是,如果您 ^C 该sleep进程,它将失败退出,并且循环因此停止。将 移至sleep循环内部或添加类似内容|| true来防止这种情况发生。

请注意,如果您使用trap "" INT完全忽略信号(而不是为其分配命令),则它也会在子进程中被忽略,因此您也无法中断something...。这至少在Bash 的手册:

如果精氨酸是空字符串,那么每个指定的信号信号规范被 shell 及其调用的命令忽略。[...] 进入 shell 时被忽略的信号无法被捕获或重置。

答案2

另一种选择是处理something-that-runs-forever信号(收到信号后优雅退出)。当然,只有当该程序在许多脚本中使用时才有意义,并且CTRL+上所需的行为C在系统上是相同的 - 继续执行脚本。

相关内容