LinuxコマンドをX秒ごとに実行または繰り返す方法


システム管理者は、特定の期間にコマンドを繰り返し実行する必要があることがよくあります。多くの場合、このようなタスクは単純なcronコマンドで簡単に完了できます。ほとんどの場合、これは機能するはずですが、cronコマンドを実行できる最短の期間は1分ごとです。信じられないかもしれませんが、多くの場合、これは遅すぎます。

このチュートリアルでは、デフォルトで3秒ごとにtopコマンド(プロセスとメモリ使用率を継続的に監視)と同様に、継続的に実行されている状態で特定のコマンドを監視または監視する簡単なスクリプト手法を学習します。

理由、コマンドを頻繁に実行する必要がある理由については、ここで説明します。日常の仕事でも、自宅のPCやラップトップでも、その理由は人それぞれだと思います。

1.ウォッチコマンドを使用します

Watchは、コマンドまたはプログラムを定期的に実行し、画面に出力を表示できるLinuxコマンドです。これは、プログラムの出力を時間内に確認できることを意味します。デフォルトでは、watchは2秒ごとにコマンド/プログラムを再実行します。間隔は、要件に合わせて簡単に変更できます。

「ウォッチ」は非常に使いやすく、テストするには、Linuxターミナルをすぐに起動して、次のコマンドを入力します。

# watch free -m

上記のコマンドは、システムの空きメモリをチェックし、2秒ごとに空きコマンドの結果を更新します。

上記の出力に見られるように、更新間隔、実行中のコマンド、現在の時刻に関する情報を(左から右に)表示するヘッダーがあります。このヘッダーを非表示にする場合は、 -t オプションを使用できます。

次の論理的な質問は、実行間隔をどのように変更するかです。そのために、コマンドが実行される間隔を指定する -n オプションを使用できます。この間隔は秒単位で指定されます。したがって、 script.sh ファイルを10秒ごとに実行するとします。これは、次のように実行できます。

# watch -n 10 script.sh

上記のようなコマンドを実行する場合は、スクリプトが配置されているディレクトリ(Learn 15 cdコマンドの例を学ぶ)に cd するか、そのスクリプトへのフルパスを指定する必要があることに注意してください。

watchコマンドの他の便利なオプションは次のとおりです。

  1. -b – creates a beep sound if the exit of the command is non-zero.
  2. -c – Interprets ANSI color sequences.
  3. -d – highlights the changes in the command output.

ログインしたユーザー、サーバーの稼働時間、負荷の平均出力を数秒ごとに継続的に監視し、次のコマンドを使用するとします。

# watch uptime

コマンドを終了するには、 CTRL + C を押します。

ここで、 'uptime' コマンドが実行され、デフォルトで2秒ごとに更新された結果が表示されます。

Linuxでは、 cp コマンドを使用してファイルをある場所から別の場所にコピーしている間、データの進行状況は表示されません。コピーされているデータの進行状況を確認するには、 watch コマンドとdu-sコマンドを組み合わせて、ディスクの使用状況をリアルタイムで確認します。

# cp ubuntu-15.10-desktop-amd64.iso /home/tecmint/ &
# watch -n 0.1 du -s /home/tecmint/ubuntu-15.10-desktop-amd64.iso 

上記のプロセスが複雑すぎて実行できないと思われる場合は、コピー中のデータの進行状況を表示するAdvancecopyコマンドを実行することをお勧めします。

2.スリープコマンドを使用する

スリープはシェルスクリプトのデバッグによく使用されますが、他にも多くの便利な目的があります。たとえば、 for または while ループと組み合わせると、非常にすばらしい結果を得ることができます。

bashスクリプトを初めて使用する場合は、bashループに関するガイドをここで確認できます。

sleep コマンドについて初めて耳にする場合は、指定された時間だけ何かを遅らせるために使用されます。スクリプトでは、これを使用して、コマンド1を実行し、10秒間待ってから、コマンド2を実行するようにスクリプトに指示できます。

上記のループを使用すると、bashにコマンドを実行し、N秒間スリープしてから、コマンドを再度実行するように指示できます。

以下に、両方のループの例を示します。

# for i in {1..10}; do echo -n "This is a test in loop $i "; date ; sleep 5; done

上記の1つのライナーは、echoコマンドを実行し、現在の日付を合計10回表示し、実行の間隔は5秒です。

出力例は次のとおりです。

This is a test in loop 1 Wed Feb 17 20:49:47 EET 2016
This is a test in loop 2 Wed Feb 17 20:49:52 EET 2016
This is a test in loop 3 Wed Feb 17 20:49:57 EET 2016
This is a test in loop 4 Wed Feb 17 20:50:02 EET 2016
This is a test in loop 5 Wed Feb 17 20:50:07 EET 2016
This is a test in loop 6 Wed Feb 17 20:50:12 EET 2016
This is a test in loop 7 Wed Feb 17 20:50:17 EET 2016
This is a test in loop 8 Wed Feb 17 20:50:22 EET 2016
This is a test in loop 9 Wed Feb 17 20:50:27 EET 2016
This is a test in loop 10 Wed Feb 17 20:50:32 EET 2016

独自のコマンドまたはスクリプトを使用してechoコマンドとdateコマンドを変更し、必要に応じてスリープ間隔を変更できます。

# while true; do echo -n "This is a test of while loop";date ; sleep 5; done

出力例は次のとおりです。

This is a test of while loopWed Feb 17 20:52:32 EET 2016
This is a test of while loopWed Feb 17 20:52:37 EET 2016
This is a test of while loopWed Feb 17 20:52:42 EET 2016
This is a test of while loopWed Feb 17 20:52:47 EET 2016
This is a test of while loopWed Feb 17 20:52:52 EET 2016
This is a test of while loopWed Feb 17 20:52:57 EET 2016

上記のコマンドは、ユーザーによって強制終了または中断されるまで実行されます。バックグラウンドで実行されているコマンドを実行する必要があり、cronを信頼したくない場合に便利です。

重要:上記の方法を使用する場合は、次の実行の前に、コマンドの実行が完了するのに十分な時間を与えるのに十分な長さの間隔を設定することを強くお勧めします。

結論

このチュートリアルのサンプルは便利ですが、cronユーティリティを完全に置き換えることを意図したものではありません。どちらが自分に適しているかを見つけるのはあなた次第ですが、両方の手法の使用法を分離する必要がある場合は、次のように言います。

  1. Use cron when you need to run commands periodically even after system reboots.
  2. Use the methods explained in this tutorial for programs/scripts that are meant to run within the current user session.

ご質問やご意見がございましたら、下のコメント欄にご遠慮なくお寄せください。