给定这个循环:
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在系统上是相同的 - 继续执行脚本。