Linux コマンドを X 秒ごとに実行または繰り返す方法
システム管理者は、特定の期間内にコマンドを繰り返し実行する必要があることがよくあります。多くの場合、このようなタスクは単純な cron コマンドで簡単に完了できます。ほとんどの場合、これで機能するはずですが、cron コマンドを実行できる最短の間隔は 1 分ごとです。信じられないかもしれませんが、多くの場合、これは遅すぎます。
このチュートリアルでは、デフォルトで 3 秒ごとに、top コマンド(プロセスとメモリ使用率を継続的に監視する)と同様の継続的に実行状態にある特定のコマンドを監視または監視するための簡単なスクリプト テクニックを学びます。
コマンドをこれほど頻繁に実行する必要がある理由については、ここで説明するつもりはありません。日々の仕事や自宅の PC やラップトップでも、その理由は人それぞれだと思います。
1.watchコマンドを使用する
ウォッチ は Linux コマンドで、コマンドやプログラムを定期的に実行したり、出力を画面に表示したりできます。これは、プログラムの出力を時間内に確認できることを意味します。デフォルトでは、watch は 2 秒ごとにコマンド/プログラムを再実行します。要件に合わせて間隔を簡単に変更できます。
メモリ使用量の監視
「Watch」の使い方は非常に簡単です。テストするには、すぐに Linux ターミナルを起動して次のコマンドを入力します。
watch free -m
上記のコマンドは、システムの空きメモリをチェックし、free コマンドの結果を 2 秒ごとに更新します。
上記の出力に見られるように、ヘッダーがあり、(左から右に)更新間隔、実行されているコマンド、および現在の時刻に関する情報が表示されます。このヘッダーを非表示にしたい場合は、-t
オプションを使用できます。
次の当然の疑問は、実行間隔を変更する方法です。そのために、コマンドを実行する間隔を指定する -n
オプションを使用できます。この間隔は秒単位で指定します。たとえば、script.sh
ファイルを 10 秒ごとに実行したいとします。次のように実行できます。
watch -n 10 script.sh
上記のようなコマンドを実行する場合は、ディレクトリに cd
する必要があることに注意してください(「15 cd コマンドの例を学ぶ」を参照)。スクリプトが見つかるか、そのスクリプトへのフルパスを指定します。
watch コマンドのその他の便利なオプションは次のとおりです。
-b
– コマンドの終了がゼロ以外の場合にビープ音を鳴らします。-c
– ANSI カラー シーケンスを解釈します。-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
上記のプロセスが複雑すぎて実行できないと思われる場合は、コピー中にデータの進行状況を表示する Advance copy コマンドを使用することをお勧めします。
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
上記の 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
独自のコマンドまたはスクリプトを使用してエコーコマンドと日付コマンドを変更し、必要に応じてスリープ間隔を変更できます。
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 ユーティリティを完全に置き換えることを目的としたものではありません。どちらがより効果的かを見つけるのはあなた次第ですが、両方のテクニックの使用法を区別する必要がある場合、私は次のように言います。
- システムの再起動後も定期的にコマンドを実行する必要がある場合は、 cron を使用します。
- 現在のユーザー セッション内で実行するプログラム/スクリプトには、このチュートリアルで説明されている方法を使用してください。
いつものように、ご質問やご意見がございましたら、下のコメント セクションにご遠慮なく送信してください。