web-dev-qa-db-ja.com

ターミナルでx時間間隔ごとにコマンドを繰り返しますか?

どうすれば繰り返しコマンドを時間間隔ごとに実行できるので、checkingまたはmonitoringディレクトリのコマンドを実行できますか?

スクリプトは必要ありません。ターミナルで実行する簡単なコマンドが必要です。

138
user239745

watchコマンドを使用できます。watchを使用して、指定されたコマンドを定期的に実行します。

ターミナルを開き、次を入力します。

watch -n x <your command>

xを希望する秒数に変更します。

watchコマンドとそのオプションの使用に関する詳細については、man watchを実行するか、この Link にアクセスしてください。

たとえば:以下は、同じ60sにリストされますターミナル、デスクトップディレクトリの内容。これにより、変更が行われたかどうかを確認できます。

watch -n 60 ls -l ~/Desktop
213
nux

Nuxの答えとは別に、ターミナルでこのコマンドを使用することもできます。

while true; do <your_command>; sleep <interval_in_seconds>; done

while true; do ls; sleep 2; done

このコマンドは、lsの出力を2秒間隔で出力します。

つかいます Ctrl+C プロセスを停止します。

watchの欠点はほとんどありません

  • エイリアスコマンドは使用できません。
  • コマンドの出力が非常に長い場合、スクロールは正しく機能しません。
  • 最大時間間隔 を特定の値を超えて設定するのは困難です。
  • watchは、-cまたは--colorオプションを使用してエスケープ文字を渡すANSIカラーシーケンスを解釈します。たとえば、pygmentizeの出力は機能しますが、ls --color=autoの場合は失敗します。

上記の状況では、これがより良いオプションとして表示されることがあります。

86
souravc

souravcおよびnuxの答えにピッチしたかっただけです:

  1. watchはUbuntuで完全に動作しますが、「Unix-fu」を純粋にしたい場合は避けてください。たとえば、FreeBSDでは、watchは「別のttyラインでスヌープする」コマンドです。
  2. while true; do command; sleep SECONDS; doneにも注意点があります。CTR + Cを使用すると、コマンドを強制終了するのが難しくなる場合があります。 while sleep SECONDS; do command; doneをお勧めします-短いだけでなく、割り込みも簡単です。注意点は、最初にスリープしてからコマンドを実行するということです。そのため、コマンドが最初に発生するまで、いくつかのSECONDSを待つ必要があります。
34
d33tah

定期的なコマンドの実行を可能にするcronデーモンの理想的なタスクのように聞こえます。 crontab -eコマンドを実行して、ユーザーのcron構成の編集を開始します。その形式は crontab(5) で文書化されています。基本的に、5つの時間関連のスペース区切りフィールドとそれに続くコマンドがあります。

The time and date fields are:

       field          allowed values
       -----          --------------
       minute         0-59
       hour           0-23
       day of month   1-31
       month          1-12 (or names, see below)
       day of week    0-7 (0 or 7 is Sunday, or use names)

たとえば、毎週火曜日の午前11時にPythonスクリプトを実行する場合:

0 11 * * 1 python ~/yourscript.py

@rebootなど、時間を置き換える特別な名前もいくつかあります。一時ディレクトリを作成する必要がある場合に非常に役立ちます。私のcrontabから(crontab -lでリストされています):

# Creates a temporary directory for ~/.distcc at boot
@reboot ln -sfn "$(mktemp -d "/tmp/distcc.XXXXXXXX")" "$HOME/.distcc"
11
Lekensteyn

ファイルシステムを監視している場合、inotifywaitは優れており、システムへの負荷が確実に少なくなります。

例:

1stターミナルでこのコマンドを入力します:

$ inotifywait .

次に、2ndターミナルで、現在のディレクトリに影響するコマンド、

$ touch newfile

その後、元の端末でinotifywaitが起動してイベントを報告します

./ CREATE newfile2

またはループで

$ while true ; do inotifywait . ; done
Setting up watches.  
Watches established.
./ OPEN newfile2
Setting up watches.  
Watches established.
./ OPEN newfile2
Setting up watches.  
Watches established.
./ DELETE newfile
Setting up watches.  
Watches established.
./ CREATE,ISDIR newdir
Setting up watches.  
Watches established.
5
X Tian

crontabを使用できます。コマンドcrontab -eを実行し、好みのテキストエディターで開き、この行を追加します

*/10 * * * *  /path-to-your-command

これにより、コマンドが10分ごとに実行されます

* */4 * * *  /path-to-your-command

これは、4時間ごとにコマンドを実行します

別の可能な解決策

$ ..some command...; for i in $(seq X); do $cmd; sleep Y; done

X繰り返す回数。

Y繰り返すのを待つ時間。

例:

$ echo; for i in $(seq 5); do $cmd "This is echo number: $i"; sleep 1;done
4
Maythux

次の手順を実行して、独自のrepeatコマンドを作成できます。 ここにクレジット

まず、.bash_aliasesファイルを開きます。

$ xdg-open ~/.bash-aliases

次に、これらの行をファイルの下部に貼り付けて保存します。

repeat() {
n=$1
shift
while [ $(( n -= 1 )) -ge 0 ]
do
    "$@"
done
}

第三に、ターミナルを閉じてから再度開くか、次のように入力します。

$ source ~/.bash_aliases

ほら!次のように使用できます。

$ repeat 5 echo Hello World !!!

または

$ repeat 5 ./myscript.sh
4
Blufter

上記で提案された「監視」アプローチに関する別の懸念は、プロセスが完了したときにのみ結果を表示することです。 「date; sleep 58; date」は、59秒後にのみ2つの日付を表示します... 4分間実行しているコンテンツをゆっくりと開始すると、コンテンツの複数のページがゆっくり表示されますが、実際には表示されません。

一方、「while」アプローチの懸念は、タスクの期間を考慮しないことです。

while true; do script_that_take_between_10s_to_50s.sh; sleep 50; done

これにより、スクリプトは1分ごとに実行され、1分40秒かかる場合があります。したがって、cronが1分ごとに実行できる場合でも、ここでは実行できません。

そのため、シェルで生成された出力を確認し、正確なリクエスト時間を待つには、前後の時間を調べ、whileでループする必要があります。

何かのようなもの:

while ( true ); do
  echo Date starting `date`
  before=`date +%s`
  sleep `echo $(( ( RANDOM % 30 )  + 1 ))`
  echo Before waiting `date`
  after=`date +%s`
  DELAY=`echo "60-($after-$before)" | bc`
  sleep $DELAY
  echo Done waiting `date`
done

これはこれを出力します:

ご覧のとおり、コマンドは1分ごとに実行されます。

Date starting Mon Dec 14 15:49:34 EST 2015
Before waiting Mon Dec 14 15:49:52 EST 2015
Done waiting Mon Dec 14 15:50:34 EST 2015

Date starting Mon Dec 14 15:50:34 EST 2015
Before waiting Mon Dec 14 15:50:39 EST 2015
Done waiting Mon Dec 14 15:51:34 EST 2015

そのため、「sleep echo $(( ( RANDOM % 30 ) + 1 ))」コマンドを必要なものに置き換えてください。これは、ターミナル/シェルで、毎分実行されます。別のスケジュールが必要な場合は、必要に応じて「60」秒を変更してください。

デバッグ行のない短いバージョン:

while ( true ); do
  before=`date +%s`
  sleep `echo $(( ( RANDOM % 30 )  + 1 ))` # Place you command here
  after=`date +%s`
  DELAY=`echo "60-($after-$before)" | bc`
  sleep $DELAY
done
3
jmspaggi