ホームページ  >  記事  >  運用・保守  >  Linux でタスクを定期的に実行する方法

Linux でタスクを定期的に実行する方法

王林
王林転載
2023-05-13 19:01:0415940ブラウズ

    1 チュートリアル

    1.1 crontab のインストール

    yum install contabs  #通过yum安装
    systemctl enable crond  #设置开机启动
    systemctl start crond   #启动

    1.2 crontab サービスのステータスを確認します:

    service crond status

    Linux でタスクを定期的に実行する方法

    1.3 crontab のログ情報を確認する

    tail -f /var/log/cron  #crontab的日志信息放在/var/log文件夹中
    cat  /vat/log/cron

    Linux でタスクを定期的に実行する方法

    crontab が定期的にスクリプトを実行する過程で、 be files のような権限の問題:

    Linux でタスクを定期的に実行する方法

    現時点では、スケジュールされたタスクによって実行されるスクリプトに実行権限を与える必要があります。

    chmod 777 /home/centos/sh/test.sh  #给所有权限

    1.4 スケジュールされたタスクの構成

    crontab のスケジュールされたタスク ファイルは、/etc/crontab ファイルに配置されます。 vim を使用して直接変更できます。

    Linux でタスクを定期的に実行する方法

    ##/etc/crontab ファイルのデフォルトの内容は次のとおりです。

    SHELL=/bin/bash
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    MAILTO=HOME=/
    # run-parts
    51 * * * * root run-parts /etc/cron.hourly
    24 7 * * * root run-parts /etc/cron.daily
    22 4 * * 0 root run-parts /etc/cron.weekly
    42 4 1 * * root run-parts /etc/cron.monthly

    最初の 4 行は、crond タスクを実行するための環境変数を設定するために使用されます。最初の行の SHELL 変数は、システムが使用するシェルを指定します (ここでは bash です)。 2 行目の PATH 変数はコマンドを実行するシステムのパスを指定します 3 行目の MAILTO 変数は crond のタスク実行情報がメールで root ユーザーに送信されることを指定します MAILTO 変数の値が空の場合, これは、タスクの実行情報がユーザーに送信されないことを意味します。4 行目の HOME 変数は、コマンドまたはスクリプトを実行するときに使用されるホームページを指定します。 6 行目から 9 行目までの意味については、次のセクションで詳しく説明します。

    在以上各个字段中,还可以使用以下特殊字符:
    星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
    逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
    中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
    正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。
    文件:
    /etc/cron.deny
    说明:
    该文件中所列用户不允许使用crontab命令
    
    文件:
    /etc/cron.allow
    说明:
    该文件中所列用户允许使用crontab命令
    
    文件:
    /var/spool/cron/
    说明:
    所有用户crontab文件存放的目录,以用户名命名
    
    crontab文件的含义:
    用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:
    minute hour day month week command
    
    其中:
    minute: 表示分钟,可以是从0到59之间的任何整数。
    hour:表示小时,可以是从0到23之间的任何整数。
    day:表示日期,可以是从1到31之间的任何整数。
    month:表示月份,可以是从1到12之间的任何整数。
    week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。
    command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。

    Linux でタスクを定期的に実行する方法

    • 最初の位置: 分 (0-59)

    • 2 番目の位置: 時間 (0- 23)

    • 3 番目の位置: 日 (1-31)

    • 4 番目の位置: 月 (1-12)

    • 5 番目の位置: 週 (0-6)

    • 6 番目の位置: ユーザー名

    • 7 番目の位置: スクリプトまたは定期的に実行する必要があるコマンド

    (1) スケジュールされたタスクの変更:
    crontab -e  #该命令等同于  vim /etc/crontab
    (2) スケジュールされたタスクの表示
    crontab -l  #该命令等同于 cat /etc/crontab
    1.5 の詳細な説明crontab コマンド

    1.5.1 コマンド形式
    crontab [-u user] file
    crontab [-u user] [ -e | -l | -r ]
    1.5.2 コマンド機能
    crontab コマンドを使用すると、指定したシステムコマンドやシェルスクリプトをその時点で実行できます。時間間隔の単位は、分、時間、日、月、週、または上記の任意の組み合わせにすることができます。このコマンドは、定期的なログ分析やデータのバックアップなどのタスクに非常に適しています。

    1.5.3 コマンドパラメータ
    • #-u user: 特定のユーザーの crontab サービスを設定するために使用されます。たとえば、「-」 u ixdba "ixdba ユーザーの crontab サービスの設定を示します。このパラメーターは通常、root ユーザーによって実行されます。

    • file: file はコマンド ファイルの名前です。これは、そのファイルが crontab のタスク リスト ファイルとして使用され、crontab にロードされることを意味します。このファイルがコマンドラインで指定されていない場合、crontab コマンドは標準入力 (キーボード) に入力されたコマンドを受け入れ、それらを crontab にロードします。

    • -e: ユーザーの crontab ファイルの内容を編集します。ユーザーが指定されていない場合は、現在のユーザーの crontab ファイルを編集することを意味します。

    • -l: 特定のユーザーの crontab ファイルの内容を表示します。ユーザーが指定されていない場合は、現在のユーザーの crontab ファイルの内容を表示することを意味します。

    • -r: /var/spool/cron ディレクトリからユーザーの crontab ファイルを削除します。ユーザーが指定されていない場合は、現在のユーザーの crontab が削除されます。デフォルトのドキュメント。

    • -i: ユーザーの crontab ファイルを削除するときに確認プロンプトを表示します。

    1.5.4 一般的な方法
    新しい crontab ファイルを作成する

    crontab ファイルを cron プロセスに送信することを検討する前に最初に行うこと環境変数 EDITOR を設定することです。 cron プロセスは、これを使用して、crontab ファイルの編集に使用するエディタを決定します。 UNIX および LINUX ユーザーの 99% が vi を使用しています。これに該当する場合は、$HOME ディレクトリの .profile ファイルを編集し、次の行を追加します:

    EDITOR=vi; export EDITOR

    その後、保存して終了します。 cron という名前のファイルを作成することもできます。ここで、 はユーザー名です (例: davecron)。このファイルに次の内容を追加します。

    # (put your own initials here)echo the date to the console every
    # 15minutes between 6pm and 6am
    0,15,30,45 18-06 * /bin/echo ‘date' > /dev/console

    保存して終了します。最初の 5 つのフィールドがスペースで区切られていることを確認してください。

    上記の例では、システムは現在の時刻を 15 分ごとにコンソールに出力します。システムがクラッシュまたはハングした場合、最後に表示された時刻により、システムが動作を停止した時間が一目でわかります。一部のシステムでは、tty1 がコンソールを表すために使用され、上記の例は実際の状況に応じて変更できます。作成したばかりの crontab ファイルを送信するには、この新しく作成したファイルを cron コマンドのパラメータとして使用できます:

    $ crontab davecron

    • 现在该文件已经提交给cron进程,它将每隔15分钟运行一次。

      同时,新创建文件的一个副本已经被放在/var/spool/cron目录中,文件名就是用户名(即dave)。

    • 列出crontab文件

      为了列出crontab文件,可以用:

    $ crontab -l
    0,15,30,45,18-06 * * * /bin/echo`date`> dev/tty1

    你将会看到和上面类似的内容。可以使用这种方法在$ H O M E目录中对crontab文件做一备份:

    $ crontab -l > $HOME/mycron
    • 这样,一旦不小心误删了crontab文件,可以用上一节所讲述的方法迅速恢复。

    • 编辑crontab文件

      如果希望添加、删除或编辑crontab文件中的条目,而E D I TO R环境变量又设置为vi,那么就可以用vi来编辑crontab文件,相应的命令为:

    $ crontab -e

    可以像使用v i编辑其他任何文件那样修改crontab文件并退出。如果修改了某些条目或添加了新的条目,那么在保存该文件时, cron会对其进行必要的完整性检查。如果其中的某个域出现了超出允许范围的值,它会提示你。

    我们在编辑crontab文件时,没准会加入新的条目。例如,加入下面的一条:

    # DT:delete core files,at 3.30am on 1,7,14,21,26,26 days of each month
    30 3 1,7,14,21,26 /bin/find -name “core' -exec rm {} \;

    现在保存并退出。最好在crontab文件的每一个条目之上加入一条注释,这样就可以知道它的功能、运行时间,更为重要的是,知道这是哪位用户的作业。

    现在让我们使用前面讲过的crontab -l命令列出它的全部信息:

    $ crontab -l
    # (crondave installed on Tue May 4 13:07:43 1999)
    # DT:ech the date to the console every 30 minites
    0,15,30,45 18-06 * * * /bin/echo`date`> /dev/tty1
    # DT:delete core files,at 3.30am on 1,7,14,21,26,26 days of each month
    30 3 1,7,14,21,26 * * /bin/find -name “core' -exec rm {} \;

    删除crontab文件

    要删除crontab文件,可以用:

    $ crontab -r

    恢复丢失的crontab文件

    如果不小心误删了crontab文件,假设你在自己的$HOME目录下还有一个备份,那么可以将其拷贝到/var/spool/cron/,其中是用户名。如果由于权限问题无法完成拷贝,可以用:

    $ crontab

    其中,是你在$HOME目录中副本的文件名。

    我建议你在自己的$HOME目录中保存一个该文件的副本。我就有过类似的经历,有数次误删了crontab文件(因为r键紧挨在e键的右边)。这就是为什么有些系统文档建议不要直接编辑crontab文件,而是编辑该文件的一个副本,然后重新提交新的文件。

    有些crontab的变体有些怪异,所以在使用crontab命令时要格外小心。如果遗漏了任何选项,crontab可能会打开一个空文件,或者看起来像是个空文件。这时敲delete键退出,不要按,否则你将丢失crontab文件。

    2 案例

    (1)每5秒执行一次任务

    */1 * * * * /bin/date >>/tmp/date.txt
    */1 * * * * sleep 5  && /bin/date >>/tmp/date.txt
    */1 * * * * sleep 10 && /bin/date >>/tmp/date.txt
    */1 * * * * sleep 15 && /bin/date >>/tmp/date.txt
    */1 * * * * sleep 20 && /bin/date >>/tmp/date.txt
    */1 * * * * sleep 25 && /bin/date >>/tmp/date.txt
    */1 * * * * sleep 30 && /bin/date >>/tmp/date.txt
    */1 * * * * sleep 35 && /bin/date >>/tmp/date.txt
    */1 * * * * sleep 40 && /bin/date >>/tmp/date.txt
    */1 * * * * sleep 45 && /bin/date >>/tmp/date.txt
    */1 * * * * sleep 50 && /bin/date >>/tmp/date.txt
    */1 * * * * sleep 55 && /bin/date >>/tmp/date.txt

    (2)更多案例

    实例1:每1分钟执行一次command
    命令:
    * * * * * command
    
    实例2:每小时的第3和第15分钟执行
    命令:
    3,15 * * * * command
    
    实例3:在上午8点到11点的第3和第15分钟执行
    命令:
    3,15 8-11 * * * command
    
    实例4:每隔两天的上午8点到11点的第3和第15分钟执行
    命令:
    3,15 8-11 */2 * * command
    
    实例5:每个星期一的上午8点到11点的第3和第15分钟执行
    命令:
    3,15 8-11 * * 1 command
    
    实例6:每晚的21:30重启smb
    命令:
    30 21 * * * /etc/init.d/smb restart
    
    实例7:每月1、10、22日的4 : 45重启smb
    命令:
    45 4 1,10,22 * * /etc/init.d/smb restart
    
    实例8:每周六、周日的1 : 10重启smb
    命令:
    10 1 * * 6,0 /etc/init.d/smb restart
    
    实例9:每天18 : 00至23 : 00之间每隔30分钟重启smb
    命令:
    0,30 18-23 * * * /etc/init.d/smb restart
    
    实例10:每星期六的晚上11 : 00 pm重启smb
    命令:
    0 23 * * 6 /etc/init.d/smb restart
    
    实例11:每一小时重启smb
    命令:
    * */1 * * * /etc/init.d/smb restart
    
    实例12:晚上11点到早上7点之间,每隔一小时重启smb
    命令:
    * 23-7/1 * * * /etc/init.d/smb restart
    
    实例13:每月的4号与每周一到周三的11点重启smb
    命令:
    0 11 4 * mon-wed /etc/init.d/smb restart
    
    实例14:一月一号的4点重启smb
    命令:
    0 4 1 jan * /etc/init.d/smb restart
    
    实例15:每小时执行/etc/cron.hourly目录内的脚本
    命令:
    01 * * * * root run-parts /etc/cron.hourly
    说明:
    run-parts这个参数了,如果去掉这个参数的话,后面就可以写要运行的某个脚本名,而不是目录名了

    (3) 使用注意

    注意环境变量问题
    有时我们创建了一个crontab,但是这个任务却无法自动执行,而手动执行这个任务却没有问题,这种情况一般是由于在crontab文件中没有配置环境变量引起的。

    在 crontab文件中定义多个调度任务时,需要特别注意的一个问题就是环境变量的设置,因为我们手动执行某个任务时,是在当前shell环境下进行的,程 序当然能找到环境变量,而系统自动执行任务调度时,是不会加载任何环境变量的,因此,就需要在crontab文件中指定任务运行所需的所有环境变量,这 样,系统执行任务调度时就没有问题了。

    不要假定cron知道所需要的特殊环境,它其实并不知道。所以你要保证在shelll脚本中提供所有必要的路径和环境变量,除了一些自动设置的全局变量。所以注意如下3点:

    脚本中涉及文件路径时写全局路径;

    脚本执行要用到java或其他环境变量时,通过source命令引入环境变量,如:

    cat start_cbp.sh
    #!/bin/sh
    source /etc/profile
    export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf
    /usr/local/jboss-4.0.5/bin/run.sh -c mev &
    • 当手动执行脚本OK,但是crontab死活不执行时。这时必须大胆怀疑是环境变量惹的祸,并可以尝试在crontab中直接引入环境变量解决问题。如:

    0 . /etc/profile;/bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh

    注意清理系统用户的邮件日志
    每条任务调度执行完毕,系统都会将任务输出信息通过电子邮件的形式发送给当前系统用户,这样日积月累,日志信息会非常大,可能会影响系统的正常运行,因此,将每条任务进行重定向处理非常重要。

    例如,可以在crontab文件中设置如下形式,忽略日志输出:

    0 */3* /usr/local/apache2/apachectl restart >/dev/null 2>&1

    /dev/null 2>&1表示先将标准输出重定向到/dev/null,然后将标准错误重定向到标准输出,由于标准输出已经重定向到了/dev/null,因此标准错误也会重定向到/dev/null,这样日志输出问题就解决了。

    システム レベルのタスク スケジューリングとユーザー レベルのタスク スケジューリング
    システム レベルのタスク スケジューリングは主にシステムの一部のメンテナンス操作を完了します。ユーザー レベルのタスク スケジューリングは主にユーザー定義のタスクの一部を完了します。ユーザー レベルのタスク スケジューリングは次のことができます。システム レベルに配置する必要があります。タスク スケジューリングはタスク スケジューリングを通じて行われます (推奨されません)。ただし、その逆は機能しません。root ユーザーのタスク スケジューリング操作は、crontab –uroot –e を通じて設定できます。またはスケジュールされたタスクは /etc /crontab ファイルに直接書き込むことができますが、システムを定期的に再起動するタスクを定義したい場合は、そのタスクを /etc ファイルに置く必要があることに注意してください。 /crontab ファイル (root ユーザーの下に作成した場合でも) システムを定期的に再起動するタスクも無効です。

    その他の注意事項
    新しく作成された cron ジョブ はすぐには実行されず、実行には少なくとも 2 分かかります。 cron を再起動すると、すぐに実行されます。

    crontab が突然失敗した場合は、/etc/init.d/crond restart を試して問題を解決できます。または、ログをチェックして、ジョブが実行されたか、エラーが報告されたかどうかを確認しますtail -f /var/log/cron

    crontab -r をランダムに実行しないでください。ユーザーの Crontab ファイルを Crontab ディレクトリ (/var/spool/cron) から削除します。削除後、ユーザーのすべての crontab が失われます。

    % は、crontab では特別な意味を持ち、改行を意味します。これを使用したい場合は、\% をエスケープする必要があります。たとえば、頻繁に使用される date ' %Y%m%d' は crontab では実行されないため、date ' に置き換える必要があります。 \%Y \%m\%d'

    以上がLinux でタスクを定期的に実行する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    声明:
    この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。