Linuxでコマンドを自動的に繰り返す


303

Linuxコマンドラインでn秒ごとにコマンドを繰り返すことは可能ですか?

たとえば、インポートを実行していて、

ls -l

ファイルサイズが増加しているかどうかを確認します。これを自動的に繰り返すコマンドが欲しいのですが。

回答:


541

5秒ごとに見る...

watch -n 5 ls -l

変更を視覚的に確認したい場合は--differenceslsコマンドの前に追加してください。

OSXのmanページによると、

--cumulativeオプションを使用すると、「スティッキー」が強調表示され、変更されたすべての位置の実行中の表示が表示されます。-tまたは--no-titleオプションは、間隔、コマンド、現在の時刻を表示するヘッダーと、次の空白行をオフにします。

Linux / Unix manページはここにあります


4
ニース-コマンドラインに結果が追加されないことに注意してください
Marty Wallace

1
変更の強調表示を許可する回答オプションを追加
Rawkode

3
(注)は、たとえば、あなたが見ていることをコマンドの一部である特殊文字をエスケープする必要があること: watch mysql dbname -e \"show processlist\;\"
pfrenssen

11
brew install watch
Josh Unger 2013年

1
時計は、Mac OS X 10.10にインストールされていない
ジョアン・ヌネス

118
while true; do
    sleep 5
    ls -l
done

10
watchまた、画面をクリアするという残念な副作用があるため、ループが役立つ場合があります。どちらを使用するかは、出力の目的の形式によって異なります。
William Pursell

通常はループを行いますが、1行で行います。時計の方がはるかに良く見えますが、それに切り替えなければなりません。
Don Branson、

1
@MartyWallaceこれはコマンドライン(whileループ)で実行できます。
キーヤー2012年

--differencesそれらを強調表示するために使用できることは注目に値します(ターミナルの再描画が心配な場合)
Rawkode

これはより良いですwatch。たとえば、呼び出しごとに乱数を生成する場合など、監視は機能しませんwatch -n 1 echo ${RANDOM}。ランダムは一度だけ呼ばれます。
Marcin

92

「ウォッチ」ではBusyboxの1秒未満が許可されませんが、「スリープ」では許可されます。それがあなたにとって重要な場合は、これを試してください:

while true; do ls -l; sleep .5; done

1
これは、出力をどこかにパイプする必要がある場合に役立ちます(たとえば、bar aint再帰的)
Stephen Smith

1
ありがとう。これは、watchコマンドのないbusyboxコンソールで機能します。システムの稼働時間を測定するために使用しました。アップタイムを行います。睡眠1; 完了
サンティアゴビジャフエルテ2015年

旧バージョンのbusybox(v1.11.2)でFWIWを使用します。時計がなく、スリープでは分数がサポートされていません。ただし、sleep 1は正常に使用できます。
moodboom 2016年

これは、cygwinでこれを実行するための優れた方法でもあります
Bradley

34

sleepはすでに戻ります0。そのため、私は次のものを使用しています:

while sleep 3 ; do ls -l ; done

これはミハイルのソリューションよりも少し短いです。マイナーな欠点は、ターゲットコマンドを初めて実行する前にスリープすることです。


18

コマンドにパイプや引用符などの特殊文字が含まれている場合は、コマンドに引用符を埋め込む必要があります。たとえば、を繰り返すls -l | grep "txt"には、watchコマンドは次のようになります。

watch -n 5 'ls -l | grep "txt"'


パイプ式で時計を適切に機能させるのに苦労していましたが、これを読んだ後、修正することができました:)
むさぼったelysium

13

を使用すると、cronなしで定期的にコマンドを実行できますwhile

コマンドとして:

while true ; do command ; sleep 100 ; done &
[ ex: # while true;  do echo `date` ; sleep 2 ; done & ]

例:

while true
do echo "Hello World"
sleep 100
done &

最後の&ループはバックグラウンドで行われるので、最後を忘れないでください。ただし、コマンド「ps -ef | grep your_script」を使用してプロセスIDを見つける必要がある場合は、それを強制終了する必要があります。そのため、スクリプトを実行するときに「&」を追加してください。

# ./while_check.sh &

これはスクリプトと同じループです。「while_check.sh」ファイルを作成し、これを次のように配置します。

#!/bin/bash
while true; do 
    echo "Hello World" # Substitute this line for whatever command you want.
    sleep 100
done

次に、次のように入力して実行します bash ./while_check.sh &


最後の&は、最後に&なしでコマンドを書くのと同じではありませんが、&を使用してスクリプトを呼び出します。bash ./while_check.sh&?
2016

@ransh:スクリプト./while_check.sh&を実行できるため、すぐにプロセスIDを取得できます。&をスクリプトに追加して、&なしでスクリプトを実行すると、プロセスIDを取得できませんでしたが、実行されます背景、編集したので、スクリプトを停止する必要がある場合は、プロセスIDを取得するためにpsコマンドが必要です。
Ranjithkumar T 2016

必要に応じて、echo $!各バックグラウンドプロセスの起動後にスクリプトを変更できます。これは、バックグラウンドで起動された最後の子プロセスのPIDです。
ジョナサンレフラー2016

echo `date` だけを書くには、貧弱で少しバグの多い方法dateです。(このバグは、への引数の引用がないことに関係していますecho。)の無用な使用echo
tripleee


6

「ドリフト」を避けたい場合、つまり、コマンドにかかる時間に関係なく、コマンドがN秒ごとに実行されるようにしたい場合(N秒未満であると想定)、コマンドを5秒ごとに1回繰り返すbashを以下に示します。 2番目の精度(それが追いつかない場合は警告を出力します):

PERIOD=5

while [ 1 ]
do
    let lastup=`date +%s`
    # do command
    let diff=`date +%s`-$lastup
    if [ "$diff" -lt "$PERIOD" ]
    then
        sleep $(($PERIOD-$diff))
    elif [ "$diff" -gt "$PERIOD" ]
    then
        echo "Command took longer than iteration period of $PERIOD seconds!"
    fi
done

スリープは1秒までしか正確ではないため、まだ少しドリフトする可能性があります。この正確さは、dateコマンドを独創的に使用することで改善できます。


ありがとうございます。しかし、2つの質問があります。1-そのコードをどこに保存しますか?つまり、そのスクリプトを含むファイルをどのパスに配置すればよいですか。自動的に実行されますか?2-すべてのコードをそこに入力する代わりに、phpファイルを(#do command)に含める方法は?
Hossam

1
それらを実行する方法の基本などを理解できるように、bashスクリプトについて少し調査することをお勧めします。
mcote

4

特定の回数だけ何かをしたい場合は、いつでもこれを行うことができます:

repeat 300 do my first command here && sleep 1.5

8
bash do for x in {1..300} ; do コマンドの場合 ||break;sleep 1.5; done
Jasen

4

以下を実行して、サイズのみをフィルタリングできます。ファイルが呼び出された somefilename場合、次のことができます

while :; do ls -lh | awk '/some*/{print $5}'; sleep 5; done

多くのアイデアの1つ。


2

ドリフトをより簡単に最小化するには、以下を使用します。

while :; do sleep 1m & some-command; wait; done

ループ構造を実行するbashの時間と実際に実行するスリープコマンドにより、わずかなドリフトが依然として存在します。

ヒント: ':' evals to 0、つまりtrue。


1
watch -n 5 'ls -l 

ls -l5秒ごとにコマンドを実行します

出力:-

Every 5.0s: ls -l                                                                                                      Fri Nov 17 16:28:25 2017

total 169548
-rw-rw-r--  1 sachin sachin     4292 Oct 18 12:16 About_us_Admission.doc
-rw-rw-r--  1 sachin sachin      865 Oct 13 15:26 About_us_At_glance.doc
-rw-rw-r--  1 sachin sachin     1816 Oct 13 16:11 About_us_Principle.doc
-rw-rw-r--  1 sachin sachin     1775 Oct 13 15:59 About_us_Vission_mission.doc
-rw-rw-r--  1 sachin sachin     1970 Oct 13 16:41 Academic_Middle_school.doc
-rw-rw-r--  1 sachin sachin      772 Oct 16 16:07 academics_High_School.doc
-rw-rw-r--  1 sachin sachin      648 Oct 16 13:34 academics_pre_primary.doc
-rw-rw-r--  1 sachin sachin      708 Oct 16 13:39 academics_primary.doc
-rwxrwxr-x  1 sachin sachin     8816 Nov  1 12:10 a.out
-rw-rw-r--  1 sachin sachin    23956 Oct 23 18:14 Ass1.c++
-rw-rw-r--  1 sachin sachin      342 Oct 23 22:13 Ass2.doc
drwxrwxr-x  2 sachin sachin     4096 Oct 19 10:45 Backtracking
drwxrwxr-x  3 sachin sachin     4096 Sep 23 20:09 BeautifulSoup
drwxrwxr-x  2 sachin sachin     4096 Nov  2 00:18 CL_1
drwxrwxr-x  2 sachin sachin     4096 Oct 23 20:16 Code
drwxr-xr-x  2 sachin sachin     4096 Nov 15 12:05 Desktop
-rw-rw-r--  1 sachin sachin        0 Oct 13 23:12 doc
drwxr-xr-x  4 sachin sachin     4096 Nov  6 21:18 Documents
drwxr-xr-x 27 sachin sachin    12288 Nov 17 13:23 Downloads
-rw-r--r--  1 sachin sachin     8980 Sep 19 23:58 examples.desktop

1

簡潔なソリューション。これは、失敗するまでコマンドを繰り返し実行する場合に特に役立ち、すべての出力を表示できます。

while ls -l; do
    sleep 5
done
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.