>  기사  >  운영 및 유지보수  >  예약된 작업에 대한 Linux 설명

예약된 작업에 대한 Linux 설명

巴扎黑
巴扎黑원래의
2018-05-14 10:11:316213검색

이 문서의 디렉터리:

12.1 예약된 작업 구성

12.2 crontab 파일

12. 3 crond 명령 디버깅

12.4 정확 두 번째 작업 계획

12.1 예약된 작업 구성

우선 개념을 이해해야 합니다.

(1).crond는 데몬 클래스 프로그램이며 경로는 /usr/sbin/crond입니다. . 기본적으로 crond가 서비스 모드나 시스템 모드에서 시작되면 기본적으로 백그라운드 모드에서도 시작됩니다.

(2).crondtab은 crontab 파일을 관리하는 도구이며, crontab 파일은 예약된 작업 항목을 정의하는 파일입니다.

(3).crontab 파일은 시스템 예약 작업 파일 /etc/crontab 및 /etc/cron.d/*뿐만 아니라 각 사용자의 고유한 작업 파일인 /var/spool/cron/USERNAME을 포함하여 여러 위치에 존재합니다.

그런 다음 crontab 명령이 있습니다:

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

현재 사용자의 crontab 파일을 편집하려면 crontab -e 명령을 실행하십시오. 예를 들어 루트 사용자인 경우 /var/spool을 편집합니다. /cron/루트 파일입니다. 예를 들어, 다음 줄을 작성합니다.

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

이렇게 하면 echo 명령이 1분마다 실행되고 내용이 /tmp/crond.txt 파일에 추가됩니다.

작업 계획에서 작업 항목을 정의하는 방법은 /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

이 파일에는 3개의 변수가 정의되어 있으며 그 중 하나가 PATH인데 이는 매우 중요합니다. 마지막에는 작업 항목의 정의 방법도 제공됩니다:

(1) 각 작업 항목은 6개의 섹션으로 나뉘며, 각 섹션은 공백으로 구분됩니다. /etc/crontab은 시스템 예약 작업 파일이지만 일반 예약 작업에는 이 섹션이 없습니다.

(2) 처음 5개 세그먼트는 각각 "시간 공유, 일, 월 및 주"를 나타내는 시간 설정 세그먼트입니다. 해당 정의는 합리적인 값 범위를 초과할 수 없습니다. 명령 또는 스크립트 작업 세그먼트입니다. 실행됩니다.

(3) 시간 정의 부분에서는 "*"를 사용하여 각 단위, 즉 매분, 매시간, 매일, 매월, 요일(여전히 매일)을 표시합니다.

(4) 각 기간에서 쉼표 ","를 사용하여 열거형을 나타낼 수 있습니다. 예를 들어 "0,30,50 * * * *"를 정의하여 시간, 30분, 30분을 나타냅니다. 매 시간마다 이 작업을 50분 동안 수행합니다.

(5) 각 기간에서 "-"를 사용하여 범위를 정의할 수 있으며 쉼표와 함께 사용할 수 있습니다. 예를 들어 분 세그먼트를 "00,20-30,50"으로 정의하면 정시, 20분부터 30분까지의 매분, 50분에 작업이 실행된다는 의미입니다.

(6) 각 기간에서 "/"를 사용하여 시간을 무시함을 나타냅니다. 예를 들어 작은 기간에 "0-13/2"을 정의하면 "0/2/4/6/"을 의미합니다. 8/10/12" 지점은 시간 정의를 만족합니다. "*/N"은 빈도를 나타내는 데 자주 사용됩니다. 예를 들어 "00 */2 * * *"는 매일 2시간마다 정시에 작업을 실행한다는 의미입니다.

(7) 정의된 날짜와 주가 충돌하는 경우 여러 번 실행됩니다(* 기호로 인한 충돌 제외). 예를 들어, 작업은 매월 15일에 실행되고, 작업도 수요일에 실행되도록 정의되어 있으며, 충돌이 없는 일반적인 상황에서는 수요일과 매월 15일에 실행됩니다. 특정 달이 수요일이기도 하면 해당 날짜에 작업이 두 번 실행됩니다. 따라서 주와 요일을 동시에 정의하는 작업은 피해야 합니다.

(8) 명령 단락(즉, 단락 6)에서 퍼센트 기호 "%"는 줄바꿈의 특별한 의미를 나타내기 때문에 임의로 나타날 수 없으며 첫 번째 % 이후의 모든 문자열은 명령으로 간주됩니다. .표준 입력.

예를 들어 다음 정의는 다음과 같습니다.

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

이 작업의 출력 결과는 다음과 같습니다.

"the firstcron entry"

따라서 파일 이름이 예약된 작업 항목에서 시간으로 정의된 경우 % 슬래시 이스케이프를 취소해야 합니다. 예:

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

주의가 필요한 또 다른 기간 설정은 * 기호를 사용하면 하위 수준 시간이 상위 수준 시간을 덮어쓰게 된다는 것입니다. 예를 들어 "* */2 * * *"는 작업이 2시간마다 실행되는 것이 아니라 1분마다 실행된다는 의미입니다. 시간 비트는 2시간마다로 설정되지만 분 비트는 1분마다로 설정됩니다. 이는 여전히 작업이 1분마다 실행된다는 의미입니다. 마찬가지로 "*/5 */2 * * *"의 분 자리 설정은 시간 자리 설정보다 우선하며, 이는 5분마다 실행되고 시간 자리 "00" 설정을 무시함을 나타냅니다. */2 */5 * *" 요일 설정에 관계없이 매 2시간마다 작업이 실행됨을 나타냅니다.


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

위 내용은 예약된 작업에 대한 Linux 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.