当サイトではアフィリエイト広告を利用しています。

【While】 linuxコマンドを定期的に自動で実行する方法【図解有り】

2021年10月7日

今回は、Linuxコマンドを定期的に実行したいときの方法を紹介します。
例えば、、、

・dfを使って、ファイルシステム・ディスク使用率を定期的に監視したい
・lsで生成されるファイル・ディレクトリを監視したい
・「find . -type f|wc -l」でファイルの数を監視したい

などなど様々ですが、まぁ、上記は今回私がやりたかったことなんですけどね。

コマンドの入力を定期的に行いたい理由は、iPhone内の画像や動画をサーバーに保存している最中に本当にデータを送信できているのかがiPhoneのみだと把握しづらい!!

図にするとこんな感じ。

サーバ側で簡易的にファイルの受信状況をチェックしておきたいので、dfやfindの定期実行を試してみました。

正直、こんなのは手動で適当な時に「df」で対象となるディスクの使用状況をチェックすればいい話なんですが、まあいいじゃないですか。

whileでコマンドを定期的に実行する

基本的な構成は、以下のようになります。

while true; do 実行したいコマンド; sleep 実行する間隔(秒); done

停止は「Ctrl + C」

厳密にいえば異なるかもしれませんが、イメージとしての流れは以下の図のようになります。

 

dfの場合

dfコマンドではファイルシステム・ディスクの使用状況を確認できるコマンドです。

【例①】sda1のディスク使用状況を1時間毎に出力する。

while true; do df | grep sda1; sleep 3600; done

【例②】sdb1のディスク使用率を(G,M,K)などのSI接頭語付きで6時間ごとに出力し、出力結果をファイル「hoge.log」に格納する。

while true; do df -h | grep sdb1 >> hoge.log; sleep 21600; done

 

lsの場合

【例①】カレントディレクトリを10秒毎に閲覧する。

while true; do ls; sleep 10; done

【例②】HDDなどのデバイス(/dev/sd*)の接続状況を30秒毎に確認する。

while true; do ls /dev/sd*; sleep 30; done

find . -type f|wc -lの場合

上記のコマンドは、カレントディレクトリ内に存在する、「ファイル」のみの個数を出力してくれます。

ディレクトリを指定したい場合は、「.」の部分を指定のパスにしてあげます。

【例①】ホームディレクトリ「~」内のファイル数を10秒毎に確認したい場合

while true; do find ~ -type f | wc -l; sleep 10; done

【例②】/mnt/usb1内のファイルの数を10秒ごとに確認したい場合

while true; do find /mnt/usb1 -type f | wc -l; sleep 10; done

コマンドを複数利用しての出力も可能

echoで出力内容を分かりやすく

while true; do echo ----- SSD usage -----; df | grep sda1 ;sleep 10; done

【出力結果】2回計測
----- sda1 usage -----
/dev/sda1 20509264 7785284 11659124 41% /
----- sda1 usage -----
/dev/sda1 20509264 7785284 11659124 41% /
^C

「echo;」での改行で出力結果を見やすく

while true; do echo ----- sda1 usage -----; df | grep sda1 ; echo ; sleep 10 ; done

【出力結果】

----- sda1 usage -----
/dev/sda1       20509264  7785284  11659124  41% /

----- sda1 usage -----
/dev/sda1       20509264  7785284  11659124  41% /

----- sda1 usage -----
/dev/sda1       20509264  7785284  11659124  41% /

今回作ってみたコマンド

while true;do echo ------------------------------;echo -----SSD usage----- ; echo ; df | grep sdb1 ; echo ; echo -----SSD G,M,K----- ; df -h | grep sdb1 ; echo ; echo The number ; find . -type f | wc -l ;echo; echo Contents ; ls ;echo;echo ------------------------------; sleep 10; done

分かりづらいので改行してみます。

while true;                                  #「Ctrl + C」が入力されるまでループ
do                                           #Whileループの始まり
    echo ------------------------------; #出力の始まり
    echo -----SSD usage----- ;            #-----SSD usege-----
    echo ;                                #改行
    df | grep sdb1 ;                      #sdb1のディスク使用状況を出力
    echo ;                                #改行
    echo -----SSD G,M,K----- ;            #-----SSD G,M,K-----
    df -h | grep sdb1 ;                   #sdb1のディスク使用状況をSI接頭語付きで出力
    echo ;                                #改行
    echo The number ;                     #The number←「個数」を英語にそのまま訳しただけ。
    find . -type f | wc -l ;              #対象ディレクトリにあるファイルのみの数を出力
    echo;                                 #改行
    echo Contents ;                       #Contents←「内容物」を英語に訳しただけ
    ls ;                                  #ファイルのリストを出力
    echo;                                 #改行
    echo ------------------------------;  #出力の終わり
    sleep 10;                             #ループの間隔を10秒に設定
done                                         #Whileループの終わり

出力結果

xxxの中には実際の値が入ります。

------------------------------
-----SSD usage-----

/dev/sdb1      xxxxxxxxx xxxxxxxx  xxxxxxxx  xx% /mnt/iPhone_library

-----SSD G,M,K-----
/dev/sdb1       xxxG   xxG   xxG  xx% /mnt/iPhone_library

The number
xxx

Contents
「ls」で出力されたファイルのリスト

------------------------------
------------------------------
-----SSD usage-----

/dev/sdb1      xxxxxxxxx xxxxxxxx  xxxxxxxx  xx% /mnt/iPhone_library

-----SSD G,M,K-----
/dev/sdb1       xxxG   xxG   xxG  xx% /mnt/iPhone_library

The number
xxx

Contents
「ls」で出力されたファイルのリスト

------------------------------
^C

上記のような出力結果を確認することができ、

・ファイルは受信できているのか?

・どのくらいの容量を使用しているのか

・ファイルはいくつあるのか

・どのようなファイルを受信しているのか

という情報を10秒ごとに得ることができます。

 

デメリットとしては、、、

・出力中は他の操作ができない

・これだけ打つのがめんどくさい

ってことぐらいですね。

 

そんなのは

・ターミナルをもう一つ作るかtmuxで他にセッションを作る

・シェルスクリプトに入れる

で、解決です。