(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Linux】ターミナル上にて無限ループでコマンドを発行する

スポンサーリンク

はじめに

例えば、一定間隔で実行するスクリプトの動作確認をしたい際にcrontabに追加するのではなく任意の秒で繰り返し実行したいケースがあるとします。

そのような場合に利用できる手法に「watchコマンド」を利用するものと「while構文」を利用する二つのやり方があります。

本記事ではその二つの使い分けまで含めて解説しました。

環境情報
  • Debian GNU/Linux 9 (stretch)

watchコマンドを利用した無限ループ

マニュアルに以下のように記載されるwatchコマンド。

NAME
watch - execute a program periodically, showing output fullscreen

主な引数は-nです。

n, --interval seconds
Specify update interval. The command will not allow quicker
than 0.1 second interval, in which the smaller values are con‐
verted. Both '.' and ',' work for any locales.

上にもある通り、0.1秒単位でも制御可能なので例えば以下のように1.5秒毎に実行することも可能です。

$ watch -n 1.5 "date"

以下のような表示形式に画面が表示され

Every 1.5s: date                            <hostname>: Tue Dec 17 12:08:57 2019

Tue Dec 17 12:08:57 UTC 2019

上の画面が指定した秒数毎に切り替わります。

while構文を利用した無限ループ

こちらは説明不要でsleepを挟むことで一定間隔で実現しています。

$ while :; do date ; sleep 1.5; done
Tue Dec 17 12:08:57 UTC 2019
Tue Dec 17 12:08:58 UTC 2019
Tue Dec 17 12:09:00 UTC 2019
Tue Dec 17 12:09:01 UTC 2019
Tue Dec 17 12:09:03 UTC 2019

使い分けのポイント

個人的な使い分けポイントとして、上の例にもあるようにwatchコマンドでは画面がクリアされてしまいます

要は

$ watch -n 1 "date"

$  while :; do date ; sleep 1; clear; done

と同じ動きをします。

つまり、画面にクリア処理をしていい場合はwatchコマンド、画面をクリアせずに前回の標準出力含めて確認したい場合はwhile構文と使い分けができます。

終わりに

構文的にもシンプルなのでwatchコマンドが存在すればそちらを採用するのが良いかと思いますが

$ which watch
/usr/bin/watch

例えばデータの変化を見たい場合は前回の結果が画面上で確認できるwhile構文を採用した方がいいケースもあります。

ぜひ、欲しい出力結果に合わせて利用してください。