Heim  >  Artikel  >  Betrieb und Instandhaltung  >  Linux-Erklärung geplanter Aufgaben

Linux-Erklärung geplanter Aufgaben

巴扎黑
巴扎黑Original
2018-05-14 10:11:316213Durchsuche

Verzeichnis dieses Artikels:

12.1 Geplante Aufgaben konfigurieren

12.2 Crontab-Datei

12.3 Debugging des Crond-Befehls

12.4 Aufgabenplanung sekundengenau

12.1 Geplante Aufgaben konfigurieren

Die Konzepte, die zuerst geklärt werden müssen:

(1).crond ist ein Daemon-Klassenprogramm, der Pfad ist /usr/sbin/crond. Standardmäßig wird es im Hintergrundmodus gestartet. Wenn crond im Service- oder Systemd-Modus gestartet wird, wird es standardmäßig auch im Hintergrundmodus gestartet.

(2).crondtab ist ein Tool zum Verwalten von Crontab-Dateien, und Crontab-Dateien sind Dateien, die geplante Aufgabeneinträge definieren.

(3).crontab-Datei ist an vielen Orten vorhanden, einschließlich der vom System geplanten Aufgabendateien /etc/crontab und /etc/cron.d/* sowie der für jeden Benutzer spezifischen Aufgabendateien /var/spool/ cron/BENUTZERNAME.

Dann gibt es den Crontab-Befehl:

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

Führen Sie den Befehl crontab -e aus, um die Crontab-Datei des aktuellen Benutzers zu bearbeiten. Beispielsweise ist der aktuelle Benutzer root. Die Datei /var/spool/cron/root wird bearbeitet. Schreiben Sie beispielsweise die folgende Zeile.

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

Dadurch wird der Echo-Befehl jede Minute ausgeführt und der Inhalt an die Datei /tmp/crond.txt angehängt.

Wie Sie die Aufgabeneinträge im Aufgabenplan definieren, können Sie der Datei /etc/crontab entnehmen.

[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

In dieser Datei sind drei Variablen definiert, von denen eine PATH ist, was äußerst wichtig ist. Am Ende wird auch die Definitionsmethode der Aufgabeneinträge angegeben:

(1) Jeder Aufgabeneintrag ist in 6 Abschnitte unterteilt, wobei jeder Abschnitt durch Leerzeichen getrennt ist Der Grund hierfür ist, dass /etc/crontab die Datei für geplante Systemaufgaben ist und allgemeine geplante Aufgaben diesen Abschnitt nicht haben.

(2) Die ersten fünf Segmente sind die Zeiteinstellungssegmente, die jeweils „Zeit, Tag, Monat und Woche“ darstellen. Ihre Definitionen dürfen den angemessenen Wertebereich nicht überschreiten auszuführender Teil.

(3) Verwenden Sie im Abschnitt zur Zeitdefinition „*“, um jede Einheit anzugeben, d. h. jede Minute, jede Stunde, jeden Tag, jeden Monat und den Wochentag (immer noch jeden Tag). ).

(4). In jedem Zeitraum können Sie Kommas verwenden, um Aufzählungen darzustellen. Definieren Sie beispielsweise „0,30,50 * * * *“, um die Stunde und die Stunde jeder Stunde darzustellen . Diese Aufgabe wird sowohl in der 30. als auch in der 50. Minute ausgeführt.

(5) In jedem Zeitraum können Sie „-“ verwenden, um den Bereich zu definieren, der in Kombination mit Kommas verwendet werden kann. Wenn das Minutensegment beispielsweise als „00,20-30,50“ definiert ist, bedeutet dies, dass die Aufgabe zur vollen Stunde, jede Minute von der 20. bis zur 30. Minute und zur 50. Minute ausgeführt wird.

(6) Verwenden Sie in jedem Zeitraum „/“, um anzugeben, dass die Zeit ignoriert wird. Wenn beispielsweise „0-13/2“ im kleinen Zeitraum definiert ist, bedeutet dies „0/2/“. 4/6/8/ Der 10/12-Zoll-Punkt entspricht der Zeitdefinition. „*/N“ wird oft verwendet, um anzugeben, wie oft. „00 */2 * * *“ bedeutet beispielsweise, dass die Aufgabe jeden Tag alle zwei Stunden zur vollen Stunde ausgeführt wird.

(7) Wenn der definierte Tag und die Woche in Konflikt geraten, wird er mehrmals ausgeführt (ausgenommen Konflikte, die durch das *-Zeichen verursacht werden). Beispielsweise wird die Aufgabe am 15. eines jeden Monats ausgeführt, und die Aufgabe ist auch so definiert, dass sie am Mittwoch ausgeführt wird. Unter normalen Umständen ohne Konflikt wird sie am Mittwoch und am 15. jedes Monats ausgeführt Da ein bestimmter Monat auch ein Mittwoch ist, wird die Aufgabe am Mittwoch zweimal ausgeführt. Daher sollten Sie versuchen, Aufgaben zu vermeiden, die gleichzeitig Woche und Tag definieren.

(8). Im Befehlsabsatz (d. h. Absatz 6) darf das Prozentzeichen „%“ nicht zufällig erscheinen, da es die besondere Bedeutung des Zeilenumbruchs darstellt, und alle Zeichen nach dem ersten % Die Zeichenfolge wird als Standardeingabe des Befehls behandelt.

Zum Beispiel die folgende Definition:

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

Das Ausgabeergebnis dieser Aufgabe lautet:

"the firstcron entry"

Daher sollte % bei der Definition des Dateinamens mit Zeit im Eintrag der geplanten Aufgabe mit einem Backslash maskiert werden. Zum Beispiel:

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

Eine weitere Zeitspanneneinstellung, die beachtet werden muss, ist, dass die Verwendung des *-Zeichens dazu führt, dass die Zeit auf niedriger Ebene die Zeit auf hoher Ebene überschreibt Zeit. Beispielsweise bedeutet „* */2 * * *“, dass die Aufgabe nicht alle zwei Stunden, sondern jede Minute ausgeführt werden soll. es bedeutet also immer noch, dass die Aufgabe jede Minute ausgeführt wird. Auf die gleiche Weise überschreibt die Einstellung der Minutenziffer „*/5 */2 * * *“ die Einstellung der Stundenziffer, was bedeutet, dass sie alle 5 Minuten ausgeführt wird und die Einstellung der Stundenziffer „00“ ignoriert */2 */5 * *" Gibt an, dass die Aufgabe unabhängig von der Tageseinstellung alle zwei Stunden zur vollen Stunde ausgeführt wird.


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所擅长的。实际上能用到秒级的任务也比较少。

Das obige ist der detaillierte Inhalt vonLinux-Erklärung geplanter Aufgaben. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn