我有一条命令,希望每次终止时都可以自动再次运行,因此我运行了以下命令:
while [ 1 ]; do COMMAND; done;
但是如果我不能停止循环,Ctrl-c那只会杀死COMMAND
而不是整个循环。
我将如何实现类似的功能,但无需关闭终端就可以停止?
我有一条命令,希望每次终止时都可以自动再次运行,因此我运行了以下命令:
while [ 1 ]; do COMMAND; done;
但是如果我不能停止循环,Ctrl-c那只会杀死COMMAND
而不是整个循环。
我将如何实现类似的功能,但无需关闭终端就可以停止?
Answers:
检查命令的退出状态。如果命令被信号终止,则退出代码将为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
paplay alert.ogg
,也许是因为paplay
处理信号了吗?
您可以使用ctrl+ 停止正在运行的作业并将其置于后台z。然后,您可以使用以下方法终止您的工作:
$ kill %1
其中[1]是您的工作编号。
我会说最好将无限循环放在脚本中并在那里处理信号。这是一个基本的起点。我确定您要对其进行修改以适合。该脚本用来trap
捕获ctrl- c(或SIGTERM
),终止该命令(我在sleep
这里用作测试)并退出。
cleanup ()
{
kill -s SIGTERM $!
exit 0
}
trap cleanup SIGINT SIGTERM
while [ 1 ]
do
sleep 60 &
wait $!
done
trap "exit 0" SIGINT SIGTERM; while true; do netcat -l -p 3000; done
我一般只是按住Ctrl-C。迟早它将在COMMAND
s 之间注册,从而终止while
循环。也许有更好的方法。
paplay
1s文件),它失败。
为什么不简单地
while [ 1 ]; do COMMAND || break; done;
或者在脚本中使用时
#!/bin/bash
while [ 1 ]; do
# ctrl+c terminates COMMAND and exits the while loop
# (assuming COMMAND responds to ctrl+c)
COMMAND || break
done;
while :
将创建一个无限循环并节省您编写 [ 1 ]
while :; do COMMAND; done &
这将打印PID。如果使用退出提示符,ctrl+d
则后台作业不会退出,以后您可以使用kill PID
如果您找不到PID,可以使用pstree -pa $USER
或pgrep -fl '.*PROCESS.*'
帮助您找到它