どうすれば繰り返しコマンドを時間間隔ごとに実行できるので、checkingまたはmonitoringディレクトリのコマンドを実行できますか?
スクリプトは必要ありません。ターミナルで実行する簡単なコマンドが必要です。
watch
コマンドを使用できます。watchを使用して、指定されたコマンドを定期的に実行します。
ターミナルを開き、次を入力します。
watch -n x <your command>
xを希望する秒数に変更します。
watch
コマンドとそのオプションの使用に関する詳細については、man watch
を実行するか、この Link にアクセスしてください。
たとえば:以下は、同じ60sにリストされますターミナル、デスクトップディレクトリの内容。これにより、変更が行われたかどうかを確認できます。
watch -n 60 ls -l ~/Desktop
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
の場合は失敗します。上記の状況では、これがより良いオプションとして表示されることがあります。
souravcおよびnuxの答えにピッチしたかっただけです:
watch
はUbuntuで完全に動作しますが、「Unix-fu」を純粋にしたい場合は避けてください。たとえば、FreeBSDでは、watchは「別のttyラインでスヌープする」コマンドです。while true; do command; sleep SECONDS; done
にも注意点があります。CTR + Cを使用すると、コマンドを強制終了するのが難しくなる場合があります。 while sleep SECONDS; do command; done
をお勧めします-短いだけでなく、割り込みも簡単です。注意点は、最初にスリープしてからコマンドを実行するということです。そのため、コマンドが最初に発生するまで、いくつかのSECONDS
を待つ必要があります。定期的なコマンドの実行を可能にする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"
ファイルシステムを監視している場合、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.
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
次の手順を実行して、独自の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
上記で提案された「監視」アプローチに関する別の懸念は、プロセスが完了したときにのみ結果を表示することです。 「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