循环命令而不等待第一次运行

循环命令而不等待第一次运行

我想要一种更好的方法来做到这一点,主要用于命令行使用:

while sleep 60; do 
  mysql -e 'show processlist'; 
done

这比:

while mysql -e 'show processlist'; do
  sleep 60;
done

...因为如果我输入 a ctrl-c,它就会停止。但是,第一个版本在第一次输出之前会等待一分钟。

我知道关于watch.通常很好,但并不适合所有情况。我正在寻找一个简单的输出到标准输出,而不是诅咒。如果watch有一个选择就好了--stdout

简单是这里的关键。我不关心处理mysql语句中的错误。它可以向标准输出报告自己的错误。

答案1

Ctrl+C在正常情况下确实会杀死整个循环。该信号被发送到整个前台进程组。

您可能正在寻找

while mysql -e 'show processlist' && sleep 60; do :; done

一旦mysqlsleep失败就退出。

答案2

这个可能适合你:

trap "pkill -TERM -P $$" SIGINT

while [ 1 ]; do
   mysql -e 'show processlist'
   sleep 60
done

答案3

嗯,对于你的例子...

n=; while sleep "$((n&(n=60)))"
do   mysql...
done

...会做的。第一次会这样sleep 0,其余的都会这样sleep 60。尽管如此,我认为可能还有比这更好的方法来实现您的最终目标。

如果您确实使用过这样的东西,您可能会想在函数中执行它:

every_minute() ( n=
    while sleep "$((n&(n=60)))"
    do "$@"; done)

...或者在一行中...

every_minute() (n=; while sleep "$((n&(n=60)))"; do "$@"; done)

如果你把类似的东西放在 shell 的 rc 文件中,你可以这样做......

every_minute mysql "$whatever" "$args" "$you" "$use"

...或者您可以在任何提示符下键入单行版本并继续使用它,直到关闭 shell。

相关内容