crontab mysql定时备份

本人环境配置

  • ubuntu: 17.04
  • mysql: 5.7.18-15

编写 备份脚本

$ cat bkDbname.sh
#!/bin/bash
BKPATH="/path/to/shell-path/"
BKDBNAME="dbname"
BKDATE=$(date +%Y%m%d_%H%m%s)
BKFILE=${BKPATH}${BKDBNAME}_${BKDATE}.sql.gz
/usr/bin/mysqldump -uroot -p"password" ${BKDBNAME} | gzip>${BKFILE}

添加定时任务

打开编辑 /etc/crontab, 在末尾添加 定时任务.

 # back database 每天17点备份
 0 17   * * *   willike sh /path/to/shell-path/bkDbname.sh

crontab定时任务 格式
minute hour day month week command
分 时 日 月 周 命令

  • 星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
  • 逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
  • 中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
  • 正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。

查看crontab的日志记录定位定时任务问题

昨天crontab中的同步任务没有执行,不知道是什么原因没有执行,貌似任务hang住了,想查询一下crontab到底问题出在哪里,或者hang在了什么地方。

1、linux

看 /var/log/cron这个文件就可以,可以用tail -f /var/log/cron观察

2、unix

在 /var/spool/cron/tmp文件中,有croutXXX001864的tmp文件,tail 这些文件就可以看到正在执行的任务了。

3、mail任务

在 /var/spool/mail/root 文件中,有crontab执行日志的记录,用tail -f /var/spool/mail/root 即可查看最近的crontab执行情况。

使用Django commands构建命令行做定时(crontab)任务

需求: 我想调用django里models.py或者views.py的函数对数据库做些增删改查的操作,可以加入crontab做管理,找了半天才发现可以用django commands来搞,就简单记录下来怎么用。

这个app的内容如下:

tree weblog/
weblog/
├── __init__.py
├── __init__.pyc
├── admin.py
├── admin.pyc
├── apps.py
├── management
│   ├── __init__.py
│   ├── __init__.pyc
│   └── commands
│       ├── __init__.py
│       ├── __init__.pyc
│       ├── delete_author.py
│       └── delete_author.pyc
├── migrations
│   ├── 0001_initial.py
│   ├── 0001_initial.pyc
│   ├── __init__.py
│   └── __init__.pyc
├── models.py
├── models.pyc
├── tests.py
└── views.py

3 directories, 19 files

简单写一个函数,功能是删除weblog_author表的一条记录:

cat weblog/management/commands/delete_author.py
from django.core.management.base import BaseCommand, CommandError
from weblog.models import Author

class Command(BaseCommand):
    help = 'delete author'

    def add_arguments(self, parser):
        parser.add_argument('author_id', nargs='+', type=int)

    def handle(self, *args, **options):
        for author_id in options['author_id']:
            try:
                author = Author.objects.get(pk=author_id)
            except Author.DoesNotExist:
                raise CommandError('Author "%s" does not exist' % author_id)

            author.delete()

            self.stdout.write(self.style.SUCCESS('Successfully delete author "%s"' % author_id))

执行

python manage.py delete_author  2
Successfully delete author “2"

加入到crontab里:

*/15 * * * * python /var/www/poll_mysite/manage.py delete_author  2 >/dev/null 2>&1

Linux crontab定时任务不执行时的分析方法

在使用配置crontab过程中一直不能执行配置的任务,折腾了半夜没有解决,随找到如下文章,查问题的思路很清晰,帮我找到了问题,直接转:

crond是Linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。

使用权限:

root用户和crontab文件的所有者

语法:

crontab [-e [UserName]|-l [UserName]|-r [UserName]|-v [UserName]|File ]

说明:

crontab 是用来让使用者在固定时间或固定间隔执行程序之用,换句话说,也就是类似使用者的时程表。-u user 是指设定指定 user 的时程表,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话,就是表示设定自己的时程表。

参数:

  • -e [UserName]: 执行文字编辑器来设定时程表,内定的文字编辑器是 VI,如果你想用别的文字编辑器,则请先设定 VISUAL 环境变数来指定使用那个文字编辑器(比如说 setenv VISUAL joe)
  • -r [UserName]: 删除目前的时程表
  • -l [UserName]: 列出目前的时程表
  • -v [UserName]:列出用户cron作业的状态

自拉起脚本很简单,随便写几行就搞定了:

Shell
#!/bin/bash
processcount=$(pgrep my_app|wc -l)
cd $(cd $(dirname $0) && pwd)
if [[ 0 -eq $processcount ]]
then
echo “[ $(date) ] : my_app is down, start it!” | tee -ai ./checkprocess.log
bash ./start.sh #这里是项目的重启脚本
else
echo my_app is OK!
fi
然后丢到 crontab,1分钟执行一次:
Shell

* * * * * bash /data/app_server/checkprocess.sh >/dev/null 2>&1

本以为万事大吉了,结果还是坑了,进程再一次挂了,尼玛什么鬼?

一、检查日志

根据经验,先看一下crontab的日志:

tail /var/log/messages

没发现相关日志,看来不是打印到了这,于是查看了下crontab的默认日志位置:

tail /var/log/cron

Mar 25 21:40:01 li733-135 CROND[1959]: (root) CMD (sh /data/app_server/checkprocess.sh >/dev/null 2>&1)
Mar 25 21:40:01 li733-135 CROND[1960]: (root) CMD (/usr/lib64/sa/sa1 1 1)
Mar 25 21:40:01 li733-135 CROND[1961]: (root) CMD (/usr/sbin/ntpdate pool.ntp.org > /dev/null 2>&1)
Mar 25 21:41:01 li733-135 CROND[2066]: (root) CMD (sh /data/app_server/checkprocess.sh >/dev/null 2>&1)

很明显,任务计划确实在正常执行着,看来问题在脚本上了。

二、检查脚本

1、直接执行

检查脚本第一步,直接按照crontab里面的命令行,执行脚本:

sh /data/app_server/checkprocess.sh
[ Fri Mar 25 21:25:01 CST 2016 ] : my_app is down, start it!

sh /data/app_server/checkprocess.sh
my_app is OK!

结果进程正常拉起了!
直接执行成功,而放到crontab就失败,经验告诉我肯定的脚本环境变量有问题了!

2、环境变量

于是在脚本里面载入环境变量:

#!/bin/bash
#先载入环境变量
source /etc/profile
#其他代码不变

然后手工把进程杀死,等待自拉起,结果… 还是不行!

3、系统邮件

经验告诉我,crontab执行失败,如果没有屏蔽错误的话,会产生一个系统邮件,
位置在 /var/spool/mail/root
所以,我把crontab里面的 2>&1 这个屏蔽错误先取消掉,等待几分钟查看邮件。

cat /var/spool/mail/root 发现有如下报错:

From [email protected] Fri Mar 25 21:30:02 2016
Return-Path: <root@app_server.localdomain>
X-Original-To: root
Delivered-To: root@app_server.localdomain
Received: by app_server.localdomain (Postfix, from userid 0)
id 78DB5403E2; Fri, 25 Mar 2016 21:19:02 +0800 (CST)
From: root@app_server.localdomain (Cron Daemon)
To: root@app_server.localdomain
Subject: Cron <root@app_server> bash /data/app_server/checkprocess.sh >/dev/null
Content-Type: text/plain; charset=UTF-8
Auto-Submitted: auto-generated
X-Cron-Env: <LANG=en_US.UTF-8>
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/root>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=root>
X-Cron-Env: <USER=root>
Message-Id: <20160325131902.78DB5403E2@app_server.localdomain>
Date: Fri, 25 Mar 2016 21:19:02 +0800 (CST)

start.sh: line 4: /sbin/sudo: No such file or directory #sudo命令找不到!我次奥·~

居然是脚本里面的sudo执行失败了,找不到这个文件。看来单纯的载入 profile 不一定靠谱啊!

4、修复脚本

知道问题所在,解决就简单了,粗暴点,直接写入sudo的绝对路径

/usr/bin/sudo

继续测试自拉起,结果… 还是不行!R了G了!!

三、最终解决

继续查看了下系统邮件,发现如下信息:

Subject: Cron <root@free-node-us> source /etc/profile;bash /data/app_server/checkprocess.sh >/dev/null
Content-Type: text/plain; charset=UTF-8
Auto-Submitted: auto-generated
X-Cron-Env: <LANG=en_US.UTF-8>
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/root>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=root>
X-Cron-Env: <USER=root>
Message-Id: <20160325132403.0E8E1403E2@app_server.localdomain>
Date: Fri, 25 Mar 2016 21:24:03 +0800 (CST)

sudo: sorry, you must have a tty to run sudo #原来是这个问题!

很明显,提示了sudo必须需要tty才能执行,解决很简单,取消这个限制即可!
编辑 /etc/sudoers ,找到 Defaults requiretty, 然后注释掉这行:

vim /etc/sudoers

#Defaults requiretty

最后使用 :x! 或 :wq! 强制保存即可。
结果观察还是报了相同的错误!原来改完这个sudo并不会影响已经运行的crontab,所以需要重启crontab服务刷新下设置:

service crond restart

这下终于可以了!

四、分析总结

Linux系统里面计划任务,crontab 没有如期执行这是运维工作中比较常见的一种故障了,根据经验,大家可以从如下角度分析解决:

1、检查crontab服务是否正常

这个一般通过查看日志来检查,也就是前文提到的 /var/log/cron 或 /var/log/messages,如果里面没有发现执行记录,那么可以重启下这个服务:service crond restart

2、检查脚本的执行权限

一般来说,在crontab中建议使用 sh 或 bash 来执行shell脚本,避免因脚本文件的执行权限丢失导致任务失败。当然,最直接检查就是人工直接复制crontab -l 里面的命令行测试结果。

3、检查脚本需要用到的变量

和上文一样,通常来说从crontab里面执行的脚本和人工执行的环境变量是不一样的,所以对于一些系统变量,建议写绝对路径,或使用witch动态获取,比如 sudo_bin=$(which sudo) 就能拿到 sudo在当前系统的绝对路径了。

4、放大招:查看日志

其实,最直接最有效的就是查看执行日志了,结合crontab执行记录,以及crontab执行出错后的系统邮件,一般都能彻底找到失败的原因了!当然,要记住在crontab中如果屏蔽了错误信息,就不会发邮件了。
这又让我想起了如果crontab未屏蔽日志,可能会导致硬盘 inode 爆满

Linux配置定时任务的两种方法crontab -e与/etc/crontab及其区别

Linux配置定时任务,大家都知道使用crontab这个系统功能,但有时候我们需要区分用户执行,下面就直接说一下2种方法的区别:

方法1:

使用命令 crontab -e 然后直接编辑定时脚本。

这样执行以后,属于用户自定义的,会被写到 /var/spool/cron 目录下,生成一个和用户名一致的文件,文件内容就是我们编辑的定时脚本。

如:

[root@localhost cron.d]# cd /var/spool/cron  
[root@localhost cron]# ll  
总用量 4  
-rw-------. 1 root root 52 12月  9 10:58 root  
[root@localhost cron]# pwd  
/var/spool/cron  
[root@localhost cron]# cat root   
30 03 * * * /root/automysqlbackup.sh  

方法2:

使用命令 vi /etc/crontab 编辑定时脚本。

如:


[root@localhost ~]# cat /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # run-parts 30 * * * * root /usr/sbin/ntpdate 210.72.145.44 #30 8 * * * root /usr/sbin/ntpdate 132.228.90.101 01 * * * * root run-parts /etc/cron.hourly 02 4 * * * root run-parts /etc/cron.daily 22 4 * * 0 root run-parts /etc/cron.weekly 42 4 1 * * root run-parts /etc/cron.monthly */1 * * * * root run-parts /opt/openoffice.org3/program/start.sh ############################################ 30 4 * * * root /usr/bin/rsync -vzrtopg --progress --delete [email protected]::resource /hyy/bak/resource 30 4 * * * root /usr/bin/rsync -vzrtopg --progress --delete [email protected]::log /hyy/bak/log ############################################ [root@localhost ~]#

(系统级的)做系统级配置我们会直接配置 /etc/crontab

(用户级的)一般还是建议大家使用 crontab -e ,这样系统也会帮着检查我们配置的脚本语法。

Crontab定时任务的可能替代品yacron 为支持Docker而设计

yacron

特点

1、这个”Crontab” 使用的是YAML格式的配置文件;

2、执行任务失败时,会发出提示邮件;

3、配置灵活: 用户可自行定义任务执行成功或失败的标准;

4、专门为在Docker,Kubernetes或其他满足12因素标准的环境中运行而设计的:

  • 前台运行;

  • 所有日志内容记录到stdout/stderr [1];

5、自动重试执行失败的任务, 会有具体的错误码返回。

[1]vixie cron只会记录日志内容到syslog,需要syslog守护进程在后台运行,否则没日志!

状态

目前该项目处于开发阶段:功能并不完善,可能会遇到部分错误或者bug。

安装

yacron 需要 Python版本 >= 3.5. 建议把yacron安装在Python的虚拟环境 , 例如:

未分类

用法

配置文件内容为YAML格式, 使用 -c参数指定配置文件或者目录进行启动。 例如:

未分类

启动yacron时(前台运行!),读取配置文件 /tmp/my-crontab.yaml , 如果参数指定的是目录, 那么目录中的 *.yaml 或者 *.yml 文件充当配置 。

基础配置

以下配置每五分钟运行一次命令:

未分类

命令可以为字符串或字符串列表。 如果命令是字符串, yacron 会通过shell运行该命令,默认是使用 /bin/sh,上面的例子中使用的是/bin/bash。

如果命令是一个字符串列表,,命令会被直接执行,,而不使用shell。 执行命令的ARGV直接从配置中提取:

未分类

schedule选项可以是传统crontab格式的字符串,或者是一个有属性的对象。以下配置每五分钟运行一次,但只在指定的时间2017-07-19运行,且不在其他任何时间运行:

未分类

可以自定义命令执行时候的环境变量:

未分类

设置默认值

配置文件的default内有个特殊块,cron任务的默认值会继承该特殊块定义的所有属性。尽管 cron任务仍可以根据需要覆盖默认值:

未分类

注意:如果配置选项为目录,并且该目录下有多个配置文件,那么每个配置文件中default仅为自己文件内的任务提动默认选项;仅在当前文件内生效。

报告

Yacron内建的报告失败任务方式(以后也许会添加其他方式)是email和sentry。(往下看,更精彩)

未分类

在上述例子, onFailure 决定当任务执行失败后所做操作。在这个例子中,我们任务失败后的操作是sentry和发送email。

captureStderr: true 部分指示yacron捕捉程序运行后的标准错误,方便将错误显示在报告中。我们也可以打开captureStdout: true 用来捕捉标准输出。默认情况,yacron仅捕捉标准错误。如果没有启用任务的标准输出或标准错误,那么这些流将简单的写入yacron本身的标准输出和标准错误。

也可以通过 onSuccess 选项来报告任务执行成功或失败。

未分类

处理异常

默认情况下,如果过程返回非零代码或生成输出标准错误(已启用标准错误捕捉)yacron 认为任务执行失败。

你可以通过 failsWhen 选项让yacron决定任务执行是否失败。

未分类

  • producesStdout
    如果为true,所有捕捉的标准输出都会让yacron认为任务执行失败。默认值为false。

  • producesStderr
    如果为true,所有捕捉的标准错误都会让yacron认为任务执行失败。默认为true。

  • nonzeroReturn
    如果为true,所有任务进程返回非零代码时,yacron认为作业失败。默认为true。

在onFailure 中加入 retry 选项,在任务执行失败的时候,yacron会进行重试失败的作业。

未分类

上述设置重试失败任务最多10次,通过指数来进行定义两次重试之间的时间间隔,第一次1秒,每次重试加倍,最大间隔(延迟)为30秒。

当任务执行失败,且重试全部失败后,onPermanentFailure 选项可以定义重试失败后的操作,如发送报告或者,放弃重试。

未分类

并发

有时候某个任务执行时间过长,当达到下一个计划执行时,可能之前的任务还未运行完成, concurrencyPolicy 选项可以帮我们解决这一问题。以下是它的三个选项:

  • Allow
    允许并发执行任务(默认为Allow)

  • Forbid
    禁止并发,如果以前的任务未完成,则跳过该任务的下一次运行

  • Replace
    取消未完成的任务,新的任务开始执行,替代原任务

执行超时

(新版本 0.4)

如果你有一个可能挂起的任务,可以通过 executionTimeout 选项来指示yacron,在N秒后结束该进程,尽管它仍在运行。例如,以下cron作业需要2秒才能完成,yacron将在1秒后终止:

未分类

当终止任务时,它会让工作过程一段时间后才能正常终止,例如,它可能已经打开了一个文件,即使你告诉它关闭,该进程可能需要几秒钟来刷新缓冲区并避免丢失数据。

另一方面,有时候程序出现异常但仅仅是被卡主,无论怎样都拒绝终止。因此,yacron会检查被要求退出的程序是否已经退出了一段时间。如果没有,将强制杀掉进程。 选项killTimeout选项指示等待进程正常终止的秒数,并强制杀掉它。在unix操作系统中,我们首先发送一个 SIGTERM信号,但是如果进程在 killTimeout秒后没有退出(默认为30),那么发送SIGKILL信号进行清理进程。例如,这个cron任务忽略了SIGTERM,所以yacron会在半秒后发送SIGKILL:

未分类

Linux Crontab定时任务使用介绍及使用saltstack管理

一、引言:

最近无意之间看到salt有一个cron的模块,今天就在这里介绍linux crontab以及通过salt的cron对crontab的管理。

二、Linux crontab的介绍:

crontab是用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放在”crontab”文件中,以供之后读取和执行。crontab存储的指令被守护进程激活,crond常常在后台运行,每一分钟检查是否有预定的作业需要执行。

2.1、crond的启动与关闭:

#查看crond的状态
[root@A01-R07-I165-88 ~]# service crond status
#关闭crond
[root@A01-R07-I165-88 ~]# service crond stop
#启动crond
[root@A01-R07-I165-88 ~]# service crond start
#重启crond
[root@A01-R07-I165-88 ~]# service crond restart
#重新加载crond
[root@A01-R07-I165-88 ~]# service crond reload

2.2、全部配置文件

crontab在/etc目录下面存在cron.hourly,cron.daily,cron.weekly,cron.monthly,cron.d五个目录和crontab,cron.deny二个文件。

  • cron.daily是每天执行一次的Job;

  • cron.weekly是每个星期执行一次的Job;

  • cron.monthly是每个月执行一次的Job;

  • cron.hourly是每个小时执行一次的Job;

  • cron.d是系统自动定期需要做的任务,但是又不是按小时,按天,按星期,按月来执行的。

/etc/crontab的内容如下:

[root@A01-R07-I165-88 ~]# cat /etc/crontab 
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=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

/etc/cron.deny文件就是用于控制不让哪些用户使用crontab的功能。

2.3、用户配置文件:

每个用户都有自己得的cron配置文件,通过crontab -e就可以编辑,一般情况下我们编辑完用户的cron配置文件保存退出后,系统会自动就存放于/var/spool/cron/目录中,文件以用户名命名。

linux的cron服务是每隔一分钟去读取一次/var/spool/cron/,/etc/crontab,/etc/cron.d下面的所有内容。

2.4、cron命令格式:

crontab [ -u user ] 文件 
crontab [ -u user ] { -l | -r | -e }
-u:指定某一用户
-e:执行文字编辑器来设定用户(当前用户或指定用户)时程表,内定的文字编辑器是vi.
-r:删除用户时程表.
-l:列出用户时程表.

2.5、cron文件格式:

*  *  *  *  *  command
分 时 日 月 周   命令
第1列表示分钟1~59, 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令

2.6、特殊用户:

[root@A01-R07-I165-88 cron]# crontab -l
# Lines below here are managed by Salt, do not edit
@reboot /root/cgroup_mkdir.sh

  
@reboot是指在开机后运行,且只运行一次,效果跟设置在/etc/rc.local中一样。

另外还有:

string            meaning 
------           ------- 
@reboot        Run once, at startup. 
@yearly         Run once a year, "0 0 1 1 *". 
@annually      (same as @yearly) 
@monthly       Run once a month, "0 0 1 * *". 
@weekly        Run once a week, "0 0 * * 0". 
@daily           Run once a day, "0 0 * * *". 
@midnight      (same as @daily) 
@hourly         Run once an hour, "0 * * * *".

2.7、每10秒运行一次:

未分类

三、通过salt来管理crontab:

新增一条记录:
salt -L '*' cron.set_job yarn '10' '9' '1' '*' '*' 'source /home/yarn/.bashrc;find /sys/fs/cgroup/cpu/hadoop-yarn -mtime +15 -name "container_*" -exec rm -rf {} ;' "rm the container files"
查看记录:
salt '*' cron.raw_cron yarn
删除记录:
salt '*' cron.rm_job yarn 'source /home/yarn/.bashrc;find /sys/fs/cgroup/cpu/hadoop-yarn -mtime +15 -name "container_*" -exec rm -rf {} ;' minute='10'

Linux Crontab定时任务必备招式介绍

crontab 简介

这里的伙伴大多数做客户端开发的,可能对服务端相关的内容关注的相对少一些。 crontab 是这样一个工具,他能够根据你给出的配置在指定的时间执行任务。比如定期删除过期的日志文件(很多服务端环境,会生成大量的日志文件,在你不经意间就会把你的硬盘填满)。当然,它的应用不仅限于服务端,对于自己本地的电脑来说,也有它的用处。

crontab 是 Unix 系统的标配,几乎我们常见的大多数类 Unix 系统都自带 crontab, 包括 MacOS。 Crontab 名字的来源是 chronos – 一种极客们对时间的叫法。 关于它的更多内容,大家可以参考 Wikipedia 上面的描述:https://en.wikipedia.org/wiki/Cron。

使用方法

简单做了介绍之后,咱们来看看怎么使用。 大家可以在自己电脑的命令行中输入:

$ crontab -l

这个命令, 然后你应该会看到类似的输出:

crontab: no crontab for xxx

这个命令是用于列出你电脑上已有的计划任务,因为我们现在还没有指定任何计划任务,所以这个输出就像上面那样,告诉我们没有计划任务。 如果想添加自己的计划任务,可以输入这个命令:

$ crontab -e

这个命令会用 vi 打开一个命令行编辑器,你可以在这里编辑计划任务的描述。 crontab 描述文件中每一行代表一个任务,每一行的格式如下:

* * * * * rm /home/someuser/tmp/*

前面 5 个星号代表时间设置,从左到右每个星号的位置分别对应

分钟(0-59) 小时(0-23) 每月中的天(1-31) 每年中的月(1-12) 每周中的星期几(0-6) 0 代表星期日

每个星号的位置,可以是星号本身,也可以是具体的数字。 如果是星号本身,代表不加限制。 如果是数字,代表指定的时间。 举几个例子:

*  *   *  *  *    // 5个都是个星号,代表每分钟都会执行。 
30 *   *  *  *    // 每到 30分的时候执行一次,也就是每小时执行两次。
*  18  *  *  *    // 每天的 18 点执行一次。
*  */2 *  *  *    // 每隔 2 小时执行一次, */ 是间隔时段的表示法。

以上是 crontab 时间设置个几个常用示例, 只要按照我们上述的每隔时间点的规则来使用,几乎可以满足我们绝大部分计划任务的需求。

在时间配置之后, 就是我们要执行的脚本文件,比如我们想在每天早上 8 点的时候清空机器上的临时文件,就可以这样配置:

* 8 * * * rm /home/someuser/tmp/*

每天 8点的时候,就会执行后面的 rm 命令, 删除临时文件夹中的文件。 后面的这个命令行内容,可以是任何的 Shell 命令,包括 pipe 操作,比如:

* 8 * * * rm /home/update.sh > /var/log/update.log

这个配置会在每天 8 点的时候, 执行一个叫做 update 的脚本, 并将日志输出流重定向到 update.log 文件中。 这时我们的命令行界面应该是这样的:

未分类

编辑完成后, 按下 Esc 键, 然后输入 :wq(代表保存并退出,这个是 vi 文本工具的使用方法), 在命令行左下角是下面图片中的状态的时候,按下回车键:

未分类

这样就保存了我们刚刚编辑的任务列表,我们再输出 crontab -l 命令,可以看到任务被成功添加了。

这样就 ok 了。剩下的事情就交给 crontab 来处理了。

结语

crontab 是 Unix 系统中标配的计划任务工具,它的原理并不复杂,crontab 是一个守护进程,不停的检测它的任务列表是否符合执行条件,如果符合,就执行任务。这里跟大家聊的都是 crontab 比较常规的用法,更详细的文档,大家可以通过 man crontab 命令自行查看。相信它对大家的日常工作还是比较有帮助的。

Linux crontab设置定时重启Apache服务

通过 crontab 命令,我们可以在固定的间隔时间执行指定的系统指令或 shell script脚本。时间间隔的单位可以是分钟、小时、日、月、周及以上的任意组合。这个命令非常适合周期性的日志分析或数据备份等工作。

1.首先在 $HOME/.profile 中设置 crontab 使用的编辑器:

EDITOR=vi; export EDITOR

2.新建一个 crontab 文件, 比如 root 用户的话就叫做 rootcron, 写入以下内容 :
每天 4 点重启 httpd

00 4 * * * /usr/sbin/service httpd restart

这里遇到的问题就是, 在 centos 下直接用 serivce 无效, /usr/sbin/service 才生效.

3.直接 crontab 加上上面新建的文件 rootcron 即可提交 crontab 任务:

crontab rootcron

查看 crontab 任务:

crontab -l