linux 定时执行 cron指令

时间:2024-01-10 11:02:26

linux 中的 cron 定时执行命令,先上例子:
每间隙两分钟把 "Hello world"写到 /tmp/hello.txt

crontab -e
*/2 * * * * echo "Hello world" >> /tmp/hello.txt

以下开始
先检查是否安装,如果没有安装,则安装
用 find 查看一下,然后判定该服务是否在运行,
使用 /sbin/service crond status 命令

如果没有安装,则先安装
以centos为例

yum -y install vixie-cron
yum -y install crontabs

运行:

service crond start

停止:

service crond stop

cron 服务每分钟不仅要读一次/var/spool/cron内的所有文件,

还需要读一次/etc/crontab,
因此我们配置这个文件也能运用cron服务做一些事情。
用crontab配置是针对某个用户的,
而编辑/etc/crontab是针对系统的任务。

/etc/crontab文件的文件格式如下:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root //如果出现错误,或者有数据输出,数据作为邮件发给这个帐号
HOME=/ //使用者运行的路径,这里是根目录

# run-parts 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

cron 是一个可以用来根据时间、日期、月份、星期的组合
来调度对重复任务的执行的守护进程。

cron 的主配置文件是 /etc/crontab,它包括下面几行:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

前四行是用来配置 cron 任务运行环境的变量。
SHELL 变量的值告诉系统要使用哪个 shell 环境(
在这个例子里是 bash shell);
PATH 变量定义用来执行命令的路径。
cron 任务的输出被邮寄给 MAILTO 变量定义的用户名。
如果 MAILTO 变量被定义
为空白字符串(MAILTO=""),电子邮件就不会被寄出。
HOME 变量可以用来设置在执行命令或脚本时使用的主目录。

/etc/crontab 文件中的每一行都代表一项任务,它的格式是:

minute hour day month dayofweek command

minute — 分钟,从 0 到 59 之间的任何整数
hour — 小时,从 0 到 23 之间的任何整数
day — 日期,从 1 到 31 之间的任何整数(如果指定了月份,必须是该月份的有
效日期)
month — 月份,从 1 到 12 之间的任何整数(或使用月份的英文简写如 jan、
feb 等等)
dayofweek — 星期,从 0 到 7 之间的任何整数,这里的 0 或 7 代表星期日(
或使用星期的英文简写如 sun、mon 等等)
command — 要执行的命令(命令可以是 ls /proc >> /tmp/proc 之类的命令,也
可以是执行你自行编写的脚本的命令。)

在以上任何值中,星号(*)可以用来代表所有有效的值。譬如,月份值中的星号
意味着在满足其它制约条件后每月都执行该命令。

整数间的短线(-)指定一个整数范围。譬如,1-4 意味着整数 1、2、3、4。
用逗号(,)隔开的一系列值指定一个列表。譬如,3, 4, 6, 8 标明这四个指定的
整数。

正斜线(/)可以用来指定间隔频率。在范围后加上 /<integer> 意味着在范围内
可以跳过 integer。譬如,0-59/2 可以用来在分钟字段定义每两分钟。间隔频率
值还可以和星号一起使用。例如,*/3 的值可以用在月份字段中表示每三个月运行
一次任务。
开头为井号(#)的行是注释,不会被处理。

如你在 /etc/crontab 文件中所见,它使用 run-parts 脚本来执行
/etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly 和 /etc/cron.monthly
目录中的脚本,这些脚本被相应地每小时、每日、每周、或每月执行。这些目录中
的文件应该是 shell 脚本。

如果某 cron 任务需要根据调度来执行,而不是每小时、每日、每周、或每月地执
行,它可以被添加到 /etc/cron.d 目录中。该目录中的所有文件使用和
/etc/crontab 中一样的语法。

crontab 的例子1:

根用户以外的用户可以使用 crontab 工具来配置 cron 任务。
所有用户定义的 crontab 都被保存在 /var/spool/cron 目录中,
并使用创建它们的用户身份来执行。要以某用户身份创建一个 crontab 项目,
登录为该用户,然后键入 crontab -e 命令,
使用由 VISUAL 或 EDITOR 环境变量指定的编辑器来编辑该用户的 crontab。
该文件使用的格式和 /etc/crontab 相同。
当对 crontab 所做的改变被保存后,该 crontab 文件就会根据该用户名被保存,
并写入文件 /var/spool/cron/username 中。
cron 守护进程每分钟都检查 /etc/crontab 文件、etc/cron.d/ 目录、
以及 /var/spool/cron 目录中的改变。如果发现了改变,
它们就会被载入内存。这样,当某个 crontab 文件改变后就不必重新启动守护
进程了。

控制对 cron 的使用2:

/etc/cron.allow 和 /etc/cron.deny 文件被用来限制对 cron 的使用。
这两个使用控制文件的格式都是每行一个用户。两个文件都不允许空格。
如果使用控制文件被修改了,cron 守护进程(crond)不必被重启。
使用控制文件在每次用户添加或删除一项 cron 任务时都会被读取。
无论使用控制文件中的规定如何,根用户都总是可以使用 cron。
如果 cron.allow 文件存在,只有其中列出的用户才被允许使用 cron,
并且 cron.deny 文件会被忽略。
如果 cron.allow 文件不存在,所有在 cron.deny 中列出的用户都被禁止使用
cron。

启动和停止服务

要启动 cron 服务,使用 /sbin/service crond start 命令。要停止该服务,
使用 /sbin/service crond stop 命令。推荐你在引导时启动该服务。

Crontab使用详解
先来个测试的例子,每间隙两分钟写把 hello world写到/tmp/hi文件中
crontab -e
输入
*/2 * * * * echo "hello world." >> /tmp/hi.txt

名称 : crontab
使用权限 : 所有使用者
使用方式 :
crontab file [-u user]-用指定的文件替代目前的crontab。
crontab-[-u user]-用标准输入替代目前的crontab.
crontab-1[user]-列出用户目前的crontab.
crontab-e[user]-编辑用户目前的crontab.
crontab-d[user]-删除用户目前的crontab.
crontab-c dir- 指定crontab的目录。
crontab文件的格式:M H D m d cmd.
基本格式 :
*  *  *  *  *  command
分  时  日  月  周  命令
M: 分钟(0-59)。每分钟用*或者 */1表示
H:小时(0-23)。(0表示0点)
D:天(1-31)。
m: 月(1-12)。
d: 一星期内的天(0~6,0为星期天)。
cmd要运行的程序,程序被送入sh执行,这个shell只有USER,HOME,SHELL这三个环
境变量

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

参数 :
crontab -e : 执行文字编辑器来设定时程表,内定的文字编辑器是 VI,如果你想
用别的文字编辑器,
则请先设定 VISUAL 环境变数来指定使用那个文字编辑器(比如说 setenv VISUAL
joe)
crontab -r : 删除目前的时程表
crontab -l : 列出目前的时程表
crontab file [-u user]-用指定的文件替代目前的crontab。
时程表的格式如下 :
f1 f2 f3 f4 f5 program
其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份
,f5 表示一个星期中的第几天。program 表示要执行的程序。
当 f1 为 * 时表示每分钟都要执行 program,f2 为 * 时表示每小时都要执行程
序,其馀类推
当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,f2 为 a-b 时
表示从第 a 到第 b 小时都要执行,其馀类推
当 f1 为 */n 时表示每 n 分钟个时间间隔执行一次,f2 为 */n 表示每 n 小时
个时间间隔执行一次,其馀类推
当 f1 为 a, b, c,... 时表示第 a, b, c,... 分钟要执行,f2 为 a, b, c,...
时表示第 a, b, c...个小时要执行,其馀类推
使用者也可以将所有的设定先存放在档案 file 中,用 crontab file 的方式来设
定时程表。

例子 :
#每天早上7点执行一次 /bin/ls :
0 7 * * * /bin/ls
在 12 月内, 每天的早上 6 点到 12 点中,每隔3个小时执行一次
/usr/bin/backup :
0 6-12/3 * 12 * /usr/bin/backup

周一到周五每天下午 5:00 寄一封信给 lin3615@lin3615.com :
0 17 * * 1-5 mail -s "hi" lin3615@lin3615.com < /tmp/maildata
每月每天的午夜 0 点 20 分, 2 点 20 分, 4 点 20 分....执行 echo "haha"
20 0-23/2 * * * echo "haha"
=====================================
以下是用来执行PHP脚本和mysql数据库自动备份

执行php脚本时,在nginx中执行 php文件,两分钟执行一次
/usr/local/nginx/html/test.php
可以在 crontab中写,以下是 nginx下的php文件,
其中test.php文件中可以包含别的文件,php-fpm的路径一定要正确

*/2 * * * * /usr/local/bin/php-fpm /usr/local/nginx/html/test.php

apache下可以是这样,test.php中可以包含别的文件:

*/2 * * * * /usr/local/bin/php /usr/local/apache2/htdocs/test/test.php

还可以用 url访问,但是要安装 lynx,
假如lynx是安装在 /usr/bin/lynx,
则(可以包含其中的文件:)

*/2 * * * * /usr/bin/lynx -source http://www.lin3615.net/test.php

还可以把 .php文件放在非web目录下,
如 /usr/local/下, test.php (可以包含其中的文件):

*/2 * * * * /usr/local/bin/php /usr/local/test.php

备份mysql数据库
第一步:在服务器上配置备份目录代码

mkdir /var/lib/mysqlbackup
cd /var/lib/mysqlbackup 

第二步:编写备份脚本代码:

vim dbbackup.sh 

粘帖以下代码,更改其中的username,password和dbname,mysqldump的路径一定要正确,绝对路径,可用 find 找 mysqldump

#!/bin/sh
/绝对路径/mysqldump -uuser -ppassword dbname | gzip > /var/lib/mysqlbackup/dbname`date +%Y-%m-%d_%H%M%S`.sql.gz
cd /var/lib/mysqlbackup
rm -rf `find . -name '*.sql.gz' -mtime 10` #删除10天前的备份文件

第三步:更改备份脚本权限

chmod +x dbbackup.sh

第四步:用crontab定时执行备份脚本代码

crontab -e

若每天晚上01点00备份,添加如下代码,

00 01 * * * /var/lib/mysqlbackup/dbbackup.sh