Maison  >  Article  >  Opération et maintenance  >  Explication Linux des tâches planifiées

Explication Linux des tâches planifiées

巴扎黑
巴扎黑original
2018-05-14 10:11:316146parcourir

Répertoire de cet article :

12.1 Configurer les tâches planifiées

12.2 fichier crontab

12.3 Débogage de la commande crond

12.4 Planification des tâches précise à la seconde près

12.1 Configuration des tâches planifiées

Les concepts qui doivent être clarifiés en premier :

(1).crond est un programme de classe démon, le chemin est /usr/sbin/crond. Par défaut, il sera démarré en mode arrière-plan Lorsque crond est démarré en mode service ou systemd, il sera également démarré en mode arrière-plan par défaut.

(2).crondtab est un outil de gestion des fichiers crontab, et les fichiers crontab sont des fichiers qui définissent les entrées de tâches planifiées.

Le fichier (3).crontab existe à de nombreux endroits, y compris les fichiers de tâches planifiées du système /etc/crontab et /etc/cron.d/*, ainsi que les fichiers de tâches uniques à chaque utilisateur /var/spool/ cron/NOM D'UTILISATEUR.

Ensuite il y a la commande crontab :

-l:列出定时任务条目
-r:删除当前任务列表终端所有任务条目
-i:删除条目时提示是否真的要删除
-e:编辑定时任务文件,实际上编辑的是/var/spool/cron/*文件
-u:操作指定用户的定时任务

Exécutez la commande crontab -e pour éditer le fichier crontab de l'utilisateur actuel, par exemple, l'utilisateur actuel est root, le fichier /var/spool/cron/root est modifié. Par exemple, écrivez la ligne suivante.

* * * * * /bin/echo "the first cron entry"  >>/tmp/crond.txt

Cela exécutera la commande echo toutes les minutes et ajoutera le contenu au fichier /tmp/crond.txt.

Comment définir les entrées de tâches dans le plan de tâches, vous pouvez consulter le fichier /etc/crontab.

[root@server2 ~]# cat /etc/crontab
SHELL=/bin/bashPATH=/sbin:/bin:/usr/sbin:/usr/binMAILTO=root
 
# For details see man 4 crontabs
 
# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |# *  *  *  *  * user-name  command to be executed

Il y a 3 variables définies dans ce fichier, dont l'une est PATH, ce qui est extrêmement important. A la fin, la méthode de définition des entrées de tâches est également donnée :

(1). Chaque entrée de tâche est divisée en 6 sections, chaque section est séparée par des espaces. La raison pour laquelle il y a un nom d'utilisateur supplémentaire. La section ici est due au fait que /etc/crontab est le fichier de tâches planifiées du système et que les tâches planifiées générales n'ont pas cette section.

(2). Les cinq premiers segments sont les segments de réglage de l'heure, qui représentent respectivement "l'heure, le jour, le mois et la semaine". Leurs définitions ne peuvent pas dépasser la plage de valeurs raisonnable. tâche à exécuter.

(3). Dans la section définition du temps, utilisez "*" pour indiquer chaque unité, c'est-à-dire chaque minute, chaque heure, chaque jour, chaque mois et le jour de la semaine (toujours tous les jours). ).

(4). Dans chaque période, vous pouvez utiliser des virgules "," pour représenter les énumérations. Par exemple, définissez "0,30,50 * * * *" pour représenter l'heure et l'heure de chaque heure. . Cette tâche est effectuée à la 30e et à la 50e minute.

(5). Dans chaque période, vous pouvez utiliser "-" pour définir la plage, qui peut être utilisée en combinaison avec des virgules. Par exemple, si le segment des minutes est défini comme "00,20-30,50", cela signifie que la tâche sera exécutée à l'heure, toutes les minutes de la 20ème à la 30ème minute et à la 50ème minute.

(6). Dans chaque période, utilisez "/" pour indiquer que vous ignorez l'heure. Par exemple, si "0-13/2" est défini dans la petite période, cela signifie "0/2/". 4/6/8/ Le point 10/12" répond à la définition du temps. "*/N" est souvent utilisé pour indiquer la fréquence. Par exemple, « 00 */2 * * * » signifie exécuter la tâche toutes les deux heures chaque jour.

(7). Si le jour et la semaine définis sont en conflit, il sera exécuté plusieurs fois (hors conflits provoqués par le signe *). Par exemple, la tâche est exécutée le 15 de chaque mois, et la tâche est également définie pour être exécutée le mercredi. Dans des circonstances normales sans conflit, elle sera exécutée le mercredi et le 15 de chaque mois. d'un certain mois est également un mercredi, la tâche sera exécutée mercredi. Exécutée deux fois ce jour. Par conséquent, vous devriez essayer d’éviter les tâches qui définissent à la fois la semaine et le jour.

(8). Dans le paragraphe de commande (c'est-à-dire le paragraphe 6), le signe de pourcentage "%" ne peut pas apparaître de manière aléatoire, car il représente la signification particulière du saut de ligne et de tous les caractères après le premier %. La chaîne sera traitée comme l'entrée standard de la commande.

Par exemple, la définition suivante :

* * * * * /bin/cat >>/tmp/crond.txt %"the first %%cron entry%"

Le résultat en sortie de cette tâche sera :

"the firstcron entry"

Par conséquent, lors de la définition du nom de fichier avec l'heure dans l'entrée de la tâche planifiée, % doit être échappé avec une barre oblique inverse. Par exemple :

* * * * * cp /etc/fstab /tmp/`date +\%Y-\%m-\%d`.txt

Un autre paramètre de période qui nécessite une attention particulière est que l'utilisation du signe * entraîne l'écrasement du temps de bas niveau. temps. Par exemple, "* */2 * * *" ne signifie pas que la tâche est exécutée toutes les deux heures, mais toutes les minutes. Bien que le bit d'heure soit défini sur toutes les deux heures, le bit des minutes est défini sur toutes les minutes. cela signifie toujours que la tâche est exécutée toutes les minutes. De la même manière, le réglage du chiffre des minutes de "*/5 */2 * * *" remplace le réglage du chiffre des heures, indiquant qu'il est exécuté toutes les 5 minutes et ignore le réglage du chiffre des heures "00 ; */2 */5 * *" Indique que la tâche sera exécutée toutes les deux heures, quel que soit le réglage du jour.


12.2 crondtab file

crondtab file为任务定义文件。

(1).在此文件中,空行会被忽略,首个非空白字符且以#开头的行为注释行,但#不能出现在行中。

(2).可以在crontab file中设置环境变量,方式为"name=value",等号两边的空格可随意,即"name = value"也是允许的。但value中出现的空格必须使用引号包围。

(3). 默认crond命令启动的时候会初始化所有变量,除了某几个变量会被crond daemon自动设置好,其他所有变量都被设置为空值。自动设置的变量包括SHELL=/bin/sh,以及HOME和LOGNAME(在CentOS上则称为USER),后两者将被默认设置为/etc/passwd中指定的值。其中SHELL和HOME可以被crontab file中自定义的变量覆盖,但LOGNAME不允许覆盖。当然,自行定义的变量也会被加载到内存。

(4).除了LOGNAME/HOME/SHELL变量之外,如果设置了发送邮件,则crond还会寻找MAILTO变量。如果设置了MAILTO,则邮件将发送给此变量指定的地址,如果MAILTO定义的值为空(MAILTO=""),将不发送邮件,其他所有情况邮件都会发送给crontab file的所有者。

(5).在系统定时任务文件/etc/crontab中,默认已定义PATH环境变量和SHELL环境变量,其中PATH=/sbin:/bin:/usr/sbin:/usr/bin。

(6).crond daemon每分钟检测一次crontab file看是否有任务计划条目需要执行。

12.3 crond命令的调试

很多时候写了定时任务却发现没有执行,或者执行失败,但因为crond是后台运行的,有没有任何提示,很难进行排错。但是可以让crond运行在前端并进行调试的。

先说明下任务计划程序crond的默认执行方式。

使用下面三条命令启动的crond都是在后台运行的,且都不依赖于终端。

[root@xuexi ~]# systemctl start crond.service
[root@xuexi ~]# service crond start
[root@xuexi ~]# crond

但crond是允许接受选项的。

crond [-n] [-P] [-x flags]
选项说明:-n:让crond以前端方式运行,即不依赖于终端。-P:不重设环境变量PATH,而是从父进程中继承。-x:设置调试项,flags是调试方式,比较有用的方式是test和sch,即"-x test"和"-x sch"。
  :其中test调试将不会真正的执行,sch调试将可以看到等待时间。具体的见下面的示例。

先看看启动脚本启动crond的方式。

[root@server2 ~]# cat /lib/systemd/system/crond.service
[Unit]
Description=Command Scheduler
After=auditd.service systemd-user-sessions.service time-sync.target
 
[Service]EnvironmentFile=/etc/sysconfig/crond
ExecStart=/usr/sbin/crond -n $CRONDARGSExecReload=/bin/kill -HUP $MAINPID
KillMode=process

[Install]
WantedBy=multi-user.target

它的环境配置文件为/etc/sysconfig/crond,该文件中什么也没设置。

[root@server2 ~]# cat /etc/sysconfig/crond
# Settings for the CRON daemon.
# CRONDARGS= :  any extra command-line startup arguments for crond
CRONDARGS=

所有它的启动命令为:/usr/sbin/crond -n。但尽管此处加了"-n"选项,crond也不会前端运行,且不会依赖于终端,这是systemctl决定的。

在解释下如何进行调试。以下面的任务条目为例。

[root@server2 ~]# crontab -e* * * * * echo "hello world" >>/tmp/hello.txt

执行crond并带上调试选项test。

[root@server2 ~]# crond -x test
debug flags enabled: test
[4903] cron started
log_it: (CRON 4903) INFO (RANDOM_DELAY will be scaled with factor 8% if used.)
log_it: (CRON 4903) INFO (running with inotify support)
log_it: (CRON 4903) INFO (@reboot jobs will be run at computer's startup.)log_it: (root 4905) CMD (echo "hello world" >>/tmp/hello.txt )

执行crond并带上调试选项sch。

[root@server2 ~]# crond -x sch
debug flags enabled: sch
[4829] cron started
log_it: (CRON 4829) INFO (RANDOM_DELAY will be scaled with factor 73% if used.)
log_it: (CRON 4829) INFO (running with inotify support)
[4829] GMToff=28800log_it: (CRON 4829) INFO (@reboot jobs will be run at computer's startup.)[4829] Target time=1497950880, sec-to-wait=38      # 等待crond daemon下一次的检测,所以表示38秒后crond将检测crontab file
user [root:0:0:...] cmd="echo "hello world" >>/tmp/hello.txt "
[4829] Target time=1497950940, sec-to-wait=60Minute-ly job. Recording time 1497922081log_it: (root 4831) CMD (echo "hello world" >>/tmp/hello.txt )user [root:0:0:...] cmd="echo "hello world" >>/tmp/hello.txt "[4829] Target time=1497951000, sec-to-wait=60Minute-ly job. Recording time 1497922141log_it: (root 4833) CMD (echo "hello world" >>/tmp/hello.txt )

但要注意,在sch调试结果中的等待时间是crond这个daemon的检测时间,所以它表示等待下一次检测的时间,因此除了第一次,之后每次都是60秒,因为默认crond是每分钟检测一次crontab file的。例如,下面是某次的等待结果,在这几次等待检测过程中没有执行任何任务。

[4937] Target time=1497951720, sec-to-wait=18[4937] Target time=1497951780, sec-to-wait=60[4937] Target time=1497951840, sec-to-wait=60

还可以同时带多个调试方式,如:

[root@server2 ~]# crond -x test,schdebug flags enabled: sch test[4914] cron started
log_it: (CRON 4914) INFO (RANDOM_DELAY will be scaled with factor 21% if used.)
log_it: (CRON 4914) INFO (running with inotify support)
[4914] GMToff=28800log_it: (CRON 4914) INFO (@reboot jobs will be run at computer's startup.)[4914] Target time=1497951540, sec-to-wait=9
user [root:0:0:...] cmd="echo "hello world" >>/tmp/hello.txt "
[4914] Target time=1497951600, sec-to-wait=60Minute-ly job. Recording time 1497922741log_it: (root 4916) CMD (echo "hello world" >>/tmp/hello.txt )

这样在调试定时任务时间时,也不会真正执行命令。

12.4 精确到秒的任务计划

默认情况下,crond执行的任务只能精确到分钟,无法精确到秒。但通过技巧,也是能实现秒级任务的。

(1).方法一:不太精确的方法

写一个脚本,在脚本中sleep3秒钟的时间,这样能实现每3秒执行一次命令。

[root@xuexi ~]# cat /tmp/a.sh#!/bin/bash
#
PATH="$PATH:/usr/local/bin:/usr/local/sbin"for ((i=1;i<=20;i++));dols /tmpsleep 3done

[root@xuexi ~]# cat /var/spool/cron/lisi* * * * * /bin/bash /tmp/a.sh

但是这样的方法不是最佳方法,因为执行命令也需要时间,且crond默认会有一个随机延时,随机延时由变量RANDOM_DELAY定义。

(2).方法二:在cron配置文件中写入多条sleep命令和其他命令。

[root@xuexi ~]# cat /var/spool/cron/lisi* * * * * ls /tmp* * * * * sleep 3 && ls /tmp* * * * * sleep 6 && ls /tmp* * * * * sleep 9 && ls /tmp* * * * * sleep 12 && ls /tmp* * * * * sleep 15 && ls /tmp* * * * * sleep 18 && ls /tmp* * * * * sleep 21 && ls /tmp* * * * * sleep 24 && ls /tmp* * * * * sleep 27 && ls /tmp* * * * * sleep 30 && ls /tmp
…* * * * * sleep 57 && ls /tmp

这种方式很繁琐,但是更精确。如果定义到每秒级别就得写60行cron记录。

由此能看出,秒级的任务本就不是crond所擅长的。实际上能用到秒级的任务也比较少。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn