我想要一种更好的方法来做到这一点,主要用于命令行使用:
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
一旦mysql
或sleep
失败就退出。
答案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。