天天看点

关于定时任务,看着一系列就够了——3.Linux定时任务一、简介二、Crontab配置三、特殊事项:四、适应场景:

一、简介

Linux系统任务是由 cron (crond) 这个系统服务来控制的,这个系统服务是默认启动的。crond 命令每分锺会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。用户自己设置的计划任务则使用crontab 命令。

二、Crontab配置

在CentOS系统中,

cat /etc/crontab
           

配置文件可以看到如下解释:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# 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
           

可以看到 创建一个定时任务 需要指定:

cron表达式 指定用户(可省略) 具体执行任务

用基础的 调度器、触发器、执行器来划分:

crontab程序本身是调度器,

在配置文件中配的cron表达式是触发器,

在配置文件中配置的具体执行任务是执行器。

crontab语法

crontab [ -u user ] file
           

或者

crontab [ -u user ] { -l | -r | -e }
           

注:如果不使用 -u user 的话,就是表示设定自己的时程表。

-e : 执行文字编辑器来设定时程表(最常用)

-r : 删除目前的时程表

-l : 列出目前的时程表

举例:

0 */2 * * * /sbin/service httpd restart  意思是每两个小时重启一次apache 

50 7 * * * /sbin/service sshd start  意思是每天7:50开启ssh服务 

50 22 * * * /sbin/service sshd stop  意思是每天22:50关闭ssh服务 

0 0 1,15 * * fsck /home  每月1号和15号检查/home 磁盘 

1 * * * * /home/bruce/backup  每小时的第一分执行 /home/bruce/backup这个文件 

00 03 * * 1-5 find /home "*.xxx" -mtime +4 -exec rm {} \;  每周一至周五3点钟,在目录/home中,查找文件名为*.xxx的文件,并删除4天前的文件。

30 6 */10 * * ls  意思是每月的1、11、21、31日是的6:30执行一次ls命令
           

命令:

service crond start    //启动服务
service crond stop    //关闭服务
service crond restart    //重启服务
service crond reload    //重新载入配置
           

三、特殊事项:

  1. crontab有2种编辑方式:直接编辑/etc/crontab文件与crontab –e,其中/etc/crontab里的计划任务是系统中的计划任务,而用户的计划任务需要通过crontab –e来编辑;
  2. 每次编辑完某个用户的cron设置后,cron自动在/var/spool/cron下生成一个与此用户同名的文件,此用户的cron信息都记录在这个文件中,这个文件是不可以直接编辑的,只可以用crontab -e 来编辑。
  3. crontab中的command尽量使用绝对路径,否则会经常因为路径错误导致任务无法执行。
  4. 新创建的cron job不会马上执行,至少要等2分钟才能执行,可从起cron来立即执行。
  5. %在crontab文件中表示“换行”,因此假如脚本或命令含有%,需要使用\%来进行转义。
  6. 脚本无法执行问题

如果我们使用 crontab 来定时执行脚本,无法执行,但是如果直接通过命令(如:./test.sh)又可 以正常执行,这主要是因为无法读取环境变量的原因。

解决方法:

所有命令需要写成绝对路径形式,如: /usr/local/bin/docker。

在 shell 脚本开头使用以下代码:

#!/bin/sh

. /etc/profile
. ~/.bash_profile
           

3、在 /etc/crontab 中添加环境变量,在可执行命令之前添加命令 . /etc/profile;/bin/sh,使得环境变量生效,例如:

20 03 * * * . /etc/profile;/bin/sh /var/www/runoob/test.sh
           

四、适应场景:

Liunx的定时任务适合进行一些非业务的操作,比如简单的检测业务系统是否异常,定时清除一些系统冗余数据,检查系统情况等。在Liunx定时中不建议放特别复杂的逻辑。