ウェブサイト検索

Linuxコマンドを毎秒X回無限に実行または繰り返す方法


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

このチュートリアルでは、topコマンド(プロセスとメモリの使用状況を継続的に監視する)に似て、特定のコマンドを継続的に実行状態で監視するための簡単なスクリプティング技法を学びます。デフォルトでは、3秒ごとに監視します。

なぜあなたがこれほど頻繁にコマンドを実行する必要があるのか、その理由を議論することはありません。私は、誰もが日常の仕事や家庭のPC、ノートパソコンで異なる理由を持っていると信じています。

1. watchコマンドを使用する

Watchは、コマンドやプログラムを定期的に実行し、画面上に出力を表示することを可能にするLinuxコマンドです。これにより、プログラムの出力をリアルタイムで見ることができます。デフォルトでは、watchはコマンド/プログラムを2秒ごとに再実行します。この間隔は、要件に応じて簡単に変更できます。

メモリ使用量を監視する

「Watch」は非常に使いやすく、テストするにはすぐにLinuxターミナルを開き、次のコマンドを入力できます:

# watch free -m

上記のコマンドは、システムの空きメモリを確認し、free コマンドの結果を毎秒2回更新します。

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

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

# watch -n 10 script.sh

注意してください。この上記のようにコマンドを実行すると、スクリプトがあるディレクトリにcdする必要があります(スクリプトのある場所に移動するための15例を学ぶ)または、そうでなければそのスクリプトへのフルパスを指定してください。

watchコマンドの他の便利なオプションは:

  1. -b – コマンドの終了がゼロでない場合にビープ音を生成します。
  2. -c – ANSI カラーシーケンスを解釈します。
  3. -d はコマンド出力の変更点を強調表示します。

ログインユーザーの監視、稼働時間および負荷平均

ログイン中のユーザー、サーバーの稼働時間、および負荷平均出力を数秒ごとに継続して監視したいとしましょう。その場合、次のコマンドを使用してください。

# 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 

上記のプロセスが達成するにはあまりにも複雑だと思うなら、データをコピーしている間の進捗を表示する「アドバンスコピーコマンド」を使うことをお勧めします。

2. sleepコマンドを使用する

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

もしbashスクリプトが初めてであれば、こちらでbashループに関するガイドを確認できます。

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

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

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

for ループの例

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

上記のワンライナーは、echoコマンドを実行し、現在の日付を表示し、実行の間に5秒のスリープを挟んで合計10回実行します。

ここにサンプル出力があります:

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 ループの例

# 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. システムが再起動した後でも定期的にコマンドを実行する必要がある場合は、cronを使用してください。
  2. このチュートリアルで説明されている方法を使用して、現在のユーザーセッション内で実行されることを目的としたプログラムやスクリプトに適用してください。

いつものように、質問やコメントがある場合は、お気軽に下のコメント欄に投稿してください。

関連記事: