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

今回は、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で他にセッションを作る
・シェルスクリプトに入れる
で、解決です。
ディスカッション
コメント一覧
まだ、コメントがありません