我有一个命令,我想在每次终止时自动再次运行,所以我运行了如下命令:
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