1. ホーム
  2. スクリプト・コラム
  3. リナックスシェル

シェルで一定時間ごとにスクリプトを実行する例

2022-02-13 03:42:31


1. テストスクリプトのスクリプトタイム.shを書く

$ cat time.sh 
#! /bin/bash
echo $(date +%s) >> /home/ocean/out.txt

chmod 777 test.shを保存した後、パーミッションを付与することを忘れないでください。

2. 時間指定タスクの追加

$ crontab -e
no crontab for ocean - using an empty one

Select an editor. To change later, run 'select-editor'. 1.
 1. /bin/nano <---- easiest
 2. /usr/bin/vim.tiny
 3. /bin/ed



内容は、1分ごとに実行する、に編集されます。

# m h dom mon dow command
 * * * * * * /home/ocean/workspaces/shell/time.sh


3. 時間指定タスクが正常に追加されたかどうかを確認する

$ crontab -l 

4. cronの再起動:新しく追加された時間指定タスクはすぐには実行されず、サーバーを再起動しない限り、一般的にしばらく待つ必要があります。

$ sudo service cron restart 


新しく作成されたcronジョブはすぐには実行されませんが、少なくとも2分後に実行されることに注意してください。もし、cronサービスを再起動すれば、すぐに実行されます。

5. 実行結果を見る

$ cat out.txt
1552543807
1552543861
1552543921
1552543981
1552544041
1552544101

プリンシプル

ubuntuはデフォルトでcronがインストールされており、ブートストラップされています。

cronが起動すると、その設定ファイルをすべて読み込み、コマンドと実行時間に基づいてcronがジョブをスケジュールします。

cronには、システムタスク用のグローバル設定ファイル(/etc/crontab)と、特定のユーザー用にcrontabコマンドが生成する設定ファイル群(/var/spool/cron以下のファイル)の2つの設定ファイルがあります。時限タスクはどちらかに設定することができます。

ユーザーごとのスケジュールタスクプロファイル

$ ls -l /var/spool/cron/
total 4
drwx-wx--T 2 root crontab 4096 Nov 16 2017 crontabs


注意:他のプランが新しく追加されたとしても、この曲のディレクトリには1つのクロンタブしか存在しません。

グローバル設定ファイル

$ cat /etc/crontab 
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
these files also have username fields, # that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user command
17 * * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

ununtuは、run-partsコマンドを呼び出すことで、4つのディレクトリにあるすべてのスクリプトを一定間隔で実行します。
1) /etc/cron.hourly, ディレクトリ内のスクリプトは、1時間に1回、各時間の17分に実行されるようにします。
2) /etc/cron.daily, 毎日午後6時25分にスクリプトが1日1回実行される場所。
3) /etc/cron.weekly: スクリプトは週に1回、7日目の午後6時47分に実行されます。
4) /etc/cron.mouthlyで、月に一度、その月の初日の午後6時52分にスクリプトが実行されます。
 もちろん、上記の時間はすべてシステムのデフォルトであり、必要に応じて変更することが可能です。

コーンプログラムはバックグラウンドで実行され、どのホームページが実行予定であるか、クーロンスケジュールをチェックします。

cronのON/OFF

<テーブル コマンド 役割 sudo サービス クロン ステータス cronの状態を表示する sudo /etc/init.d/cron スタート cronの起動 sudo /etc/init.d/cron 停止 cronをシャットダウンする sudo /etc/init.d/cronを再起動します。 cronを再起動する

クーロンスケジュール

という形で、cronスケジュールにエントリーを追加します。

min hour dayofmonth month dayofweek command

この分布は、分、時間、日、月、曜日を表しています。1-12: 0-7

いくつかの特殊な記号の意味を覚えましょう。

  •  アスタリスク(*):取りうるすべての値を表す。例えば、時間フィールドでは、アスタリスクはすべての時間に相当し、月フィールドでは、アスタリスクはすべての月に相当する。
  •  カンマ(,):「"1,2,5,7,8,9"」のように、カンマで区切って値のリスト範囲を指定することができます。
  •  ミドルバー(-):整数の間のミドルバーで整数の範囲を示すことができます。例えば、"2-6" は "2,3,4,5,6" を意味します。
  •  スラッシュ(/)。スラッシュを使用すると、時間間隔の頻度を指定することができます。また、スラッシュはアスタリスクと一緒に使用することもできます。例えば、*/10を分フィールドで使用すると、10分毎にという意味になります。

コーンスケジュールの例

  •  * * * * test .sh 1分毎に1回実行
  •  */5 * * * * test .sh 5分おきに test .sh を実行する。
  •  0 */2 * * * test .sh > out 2時間おきに test.sh を実行し、結果を out に格納する。
  •  00 00 * * * /home/rich/test.sh 毎日午前0:0に実行
  •  30 21 * * /home/rich/test.sh 毎日21:30に実行されます。
  •  15 16 * 1 コマンド 毎週月曜日16:15にコマンドを実行
  •  00 12 1 * * コマンド 毎月1日の正午12:00にコマンド実行
  •  00 8* * * if [date +%d -d tomorrow = 01 ] ; then ; command 毎月最終日の 8:00 にコマンドを実行。

3文字のテキスト値(月、火、水、木、金、土、日)または数値(0は日曜日、6は土曜日)を使用できます。
 を使用して、曜日テーブルのエントリを指定します。

cronのディレクトリ

正確な実行時間を必要としない場合は、あらかじめ設定されたcronスクリプトを使用する方が便利です。

$ ls /etc/cron.*ly
/etc/cron.daily:
0anacron apt-compat cracklib-runtime logrotate mlocate popularity-contest update-notifier-common
apport bsdmainutils dpkg man-db passwd ubuntu-advantage-tools

/etc/cron.hourly:

/etc/cron.monthly:
0anacron

/etc/cron.weekly:
0anacron man-db update-notifier-common

例えば、スクリプトが1日に1回実行される場合、dailyディレクトリにスクリプトをコピーするだけで、cronが毎日[/etc/crontabで設定した時間に基づいて]実行されます。

アナクロン

欠点:cronはいくつかの定時タスクを実行できるが、もし時間が来ても、その時にlinuxのシステムがシャットダウンしていたら、定時タスクは実行されない。たとえシステムの電源が再び入ったとしても、cronは見逃されたプログラムを実行しない。

解決策:起動時にシャットダウン期間から自動的にジョブを実行する「anacron」。前提条件として、このプログラムがcronディレクトリの下にあることが必要です。

アプリケーションシナリオ:anacronは、数日の頻度でコマンドを実行するために使用されます。マシンが常時オンでないことを想定しているという点で、cronとは最も異なる動作をします。

anacronの仕組み

anacronのタスクは、/etc/anacrontabに記載されています。

sudo cat /etc/anacrontab
[sudo] password for ocean: 
# /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5) for details.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
HOME=/root
LOGNAME=root

# These replace cron's entries
1 5 cron.daily run-parts --report /etc/cron.daily
7 10 cron.weekly run-parts --report /etc/cron.weekly
@monthly 15 cron.monthly run-parts --report /etc/cron.monthly



ununtuは、run-partsコマンドを呼び出すことで、3つのディレクトリにあるすべてのスクリプトを一定間隔で実行します。

上記でわかるように、anacronを実行する頻度の最小値は日数です。[cronは分)。

$ ls -l /var/spool/anacron/
total 12
-rw------- 1 root root 9 Jun 1 10:25 cron.daily
-rw------- 1 root root 9 May 27 11:01 cron.monthly
-rw------- 1 root root 9 May 30 10:28 cron.weekly


anacron プログラムは、独自のスケジュールを使用して作業ディレクトリをチェックします。

タイムテーブル形式

期間遅延識別子コマンド

  • period - タスクの頻度です。日数で指定し、毎日、毎週、毎月の場合は @daily , @weekly, @monthly で指定します。数字を使うこともできます。1 - 毎日、7 - 毎週、30 - 毎月、N - 数日というように数字を使うこともできます。anacron プログラムは、このエントリーを使用して、ジョブのタイムスタンプファイルをチェックします。
  • delay - ジョブを実行する前に待機する分数です。
  • identifier - このエントリーは、cron-weeklyのような空でない特別な文字列です。これは、ログメッセージやエラーメールでジョブを一意に識別するために使用されます。
  • command - 実行されるコマンドまたはシェルスクリプトです。

anacronは、タスクがperiodフィールドで指定された時間に実行されたかどうかを確認し、実行されていない場合は、delayフィールドで指定された分数だけ待ってからcommandフィールドで指定されたコマンドを実行します。

ジョブが実行されると、/var/spool/anacronディレクトリのjob-id (timestamp filename)フィールドで指定した名前のタイムスタンプファイルに日付が記録されます。

cronとanacronの比較

cronはlinuxに付属するデーモンで、決められた時間だけ実行するように設定されたタスクを繰り返すのに使われ、マシンがシャットダウンしてタスク実行時間を逃すと実行できなくなります。
crontab (short for cron table) は、cron が特定のタスクを定期的に実行するために使用するリストファイルと、現在のユーザー(または指定したユーザー)の crontab ファイルを作成、削除、および表示するために使用するコマンドの両方を指すことがあります。
anacron はデーモンではありませんが、cron デーモンの補足のようなものと見なすことができます。 anacron はスタンドアロンの linux プログラムで、cron デーモンや他のブートスクリプトによって起動・実行され、日・週・月単位で定期的に(最小単位は日)タスクを実行することができま す。頻繁にシャットダウンされる可能性のあるマシンに適している。マシンが再起動するとアナクロンプログラムが起動し、アナクロンタスクが正しい周期で実行されたかどうかをチェックし、実行されなかった場合はタスクが何周期遅れたかにかかわらず、アナクロンで設定した遅延時間後に一度だけ実行される。例えば、毎週ファイルをバックアップするようにタスクを設定しても、休暇で不在のため4週間コンピュータの電源が切れていた場合、帰宅して電源を入れると、anacronは一定の遅延時間後に1度だけファイルをバックアップします。cronデーモンがどのようにanacronを実行するかは、ディストリビューションによって異なります。

<テーブル クーロン アナクロン それは、デーモン デーモンではありません サーバーに最適 デスクトップ/ノートパソコンに最適 分単位でスケジュールされたタスクの実行を可能にする 1日単位でのスケジュールタスクの実行のみ可能 シャットダウン時にスケジュールタスクを実行しない スケジュールされたタスクが期限切れでマシンがシャットダウンされた場合、次にマシンの電源が入った後にスケジュールされたタスクを実行します 一般ユーザーとルートユーザーの両方が ルートユーザーのみ利用可能(通常のタスクを開始するためには特定の設定を使用する)

cronとanacronの主な違いは、cronが継続的に動作するマシンに対して効果的に機能するのに対し、anacronは1日または1週間以内にシャットダウンするマシン向けである点です。

参考にしてください。
https://blog.csdn.net/qq_32693119/article/details/79816097
https://www.cnblogs.com/daxian2012/articles/2589894.html
https://www.cnblogs.com/zhoul/p/9931664.html
https://www.linuxprobe.com/cron-anacron-work.html

シェルの周期的スクリプト法に関するこの記事で全てです。シェルの周期的スクリプティングについては、過去の記事を検索するか、引き続き以下の記事をご覧ください。