终止无限循环

终止无限循环

我有一个命令,我想在每次终止时自动再次运行,所以我运行了如下命令:

while [ 1 ]; do COMMAND; done;

但如果我不能用 as 停止循环,Ctrl-c那只会杀死COMMAND而不是整个循环。

我如何实现类似但无需关闭终端即可停止的功能?

答案1

ctrl您可以使用+停止正在运行的作业并将其置于后台z。然后你可以通过以下方式终止你的工作:

$ kill %1

其中 [1] 是您的工作编号。

答案2

检查命令的退出状态。如果命令由信号终止,则退出代码将为 128 + 信号编号。来自bash 的 GNU 在线文档:

对于 shell 而言,以零退出状态退出的命令已成功。非零退出状态表示失败。使用这种看似违反直觉的方案,因此有一种明确定义的方法来指示成功,并有多种方法来指示各种失败模式。当命令因编号为 N 的致命信号而终止时,Bash 使用值 128+N 作为退出状态。

POSIX 还指定由信号终止的命令的值大于 128,但似乎没有像 GNU 那样指定其确切值:

由于收到信号而终止的命令的退出状态应报告为大于 128。

例如,如果您使用 control-C 中断命令,则退出代码将为 130,因为 SIGINT 在 Unix 系统上是信号 2。所以:

while [ 1 ]; do COMMAND; test $? -gt 128 && break; done

答案3

我想说最好将无限循环放入脚本中并在那里处理信号。这是一个基本出发点。我确信您会想要修改它以适应。该脚本用于trap捕获ctrl- c(或SIGTERM),终止命令(我sleep在这里用作测试)并退出。

cleanup ()
{
kill -s SIGTERM $!
exit 0
}

trap cleanup SIGINT SIGTERM

while [ 1 ]
do
    sleep 60 &
    wait $!
done

答案4

如果您运行 bash,-e它将在任何错误情况下退出:

#!/bin/bash -e
false # returns 1
echo This won't be printed

相关内容