私は主にコマンドラインを使用するためにこれを行うより良い方法が欲しいです。
while sleep 60; do
mysql -e 'show processlist';
done
これは次のより良いです:
while mysql -e 'show processlist'; do
sleep 60;
done
...aを入力すると停止するctrl-c
ためです。ただし、最初のバージョンは最初に出力する前に1分待ちます。
について知っていますwatch
。一般的に良いですが、すべての状況に適しているわけではありません。私は呪われずにstdoutで単純な出力を探しています。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)
...または1行で...
every_minute() (n=; while sleep "$((n&(n=60)))"; do "$@"; done)
シェルのrcファイルにこのようなものを置くと、次のようになります。
every_minute mysql "$whatever" "$args" "$you" "$use"
...またはプロンプトで1行のバージョンを入力し、シェルが閉じるまで引き続き使用できます。