2017-09-07 20:09:31 qq_24452475 阅读数 2241

吾生也有涯,而知也无涯.

至此,总结通过 Linux 命令(crontab)实现定时任务的功能, 如果后续有其他发现,则进一步补充完善.


crontab

  • crontab 命令常用于Unix 和类 Unix的操作系统之中,用于设置周期性被执行的指令. 百度百科.
  • Cron is driven by a crontab (cron table) file, a configuration file that specifies shell commands to run periodically on a given schedule. The crontab files are stored where the lists of jobs and other instructions to the cron daemon are kept. Wikipedia.
  • 命令从标准输入设备读取指令,并将其存放于 etc 目录下的 “crontab”文件中,以供读取和执行。crontab文件具体内容如下图所示:
    crontab

Next. 通过实现简单的用例场景,掌握定时任务的配置等步骤信息.

  • 用例场景,定时向 demo.log 文件中输出时间信息.

  • 通过Linux终端(Terminal)编辑crontab文件.
crontab -e
  • 输入定时任务命令.
# 每分钟输出一次当前时间
 * * * * * echo `date` >> /demo.log
  • 执行结果
    crontab_edit

  • 最后,希望通过此例子帮助大家快速打通在Linux环境下建立“定时任务”环节,以便尽快完成开发任务,更深入的研究则需进一步参考其他的文章。
  • 谢谢 .
2019-04-10 17:05:26 qq_40384470 阅读数 98

首先linux(ubuntu)服务器定时任务执行就有一个命令~~~~>crontab

crontab 简介:

crond 是linux用来定期执行程序的命令。当安装完成操作系统之后,默认便会启动此任务调度命令。

 crontab工作流程:

crontab是UNIX系统下定期执行任务的触发器。用户把要定期执行的任务记录在这个文件下面,然后crond定期的去检查这个定期执行列表,有要执行的工作时便自动执行。

备份Mysql有多种方法:我这里就使用~~~>mysqldump 

mysqldump简介:

mysqldump是mysql用于转存储数据库的实用程序。它主要产生一个SQL脚本,其中包含从头重新创建数据库所必需的命令CREATE TABLE INSERT等。​​​​​​

mysqldump工作流程:

1.调用FTWRL(flush tables with read lock),全局禁止读写
2.开启快照读,获取此时的快照(仅对innodb表起作用)
3.备份非innodb表数据(*.frm,*.myi,*.myd等)
4.非innodb表备份完毕后,释放FTWRL锁
5.逐一备份innodb表数据
6.备份完成。

我的例子需求:

定时备份数据库,每1小时备份一次,并将当前时间作为文件夹名称,我的是分布式,分了3个库,所以我就将这三个库放在该文件夹目录下面,由此,解决需求。

实例如下:

一丶创建shell脚本

#!/bin/sh
#将当前时间赋值给变量  datetimes
datetimes=$(date --date='0 days ago' "+%Y-%m-%d-%H:%M:%S")
#创建目录 
sudo	mkdir -p	/sqlRepository/$datetimes
#并赋予该目录所有者权限
sudo	chmod	777	$datetimes
#备份数据库
#命令介绍  用户名  密码   端口   数据库名   保存的文件路径  后缀为sql  
sudo	mysqldump -uroot -p123456 -P3306 mtqiushui.dispatching > /sqlRepository/$datetimes/mtqiushui.dispatching.sql
sudo	mysqldump -uroot -p123456 -P3306 mtqiushui.auth > /sqlRepository/$datetimes/mtqiushui.auth.sql
sudo	mysqldump -uroot -p123456 -P3306 mtqiushui.resources > /sqlRepository/$datetimes/mtqiushui.resources.sql
#自此后面的注释不用管,这是我之前写的,它的作用是每1小时创建新的备份,将老的备份删除
#if	[	-f "/sqlRepository/mtqiushui.dispatching.sql" ]
#then
#sudo	rm	-rf	/sqlRepository/mtqiushui.dispatching.sql
#mysqldump -uroot -p123456 -P3306 mtqiushui.dispatching > /sqlRepository/mtqiushui.dispatching.sql
#else
#sudo mysqldump	-uroot	-p123456 -P3306 mtqiushui.dispatching	>	/sqlRepository/mtqiushui.dispatching.sql
#fi
#if	[	-f "/sqlRepository/mtqiushui.auth.sql" ]
#then
#sudo	rm	-rf	/sqlRepository/mtqiushui.auth.sql
#mysqldump -uroot -p123456 -P3306 mtqiushui.auth > /sqlRepository/mtqiushui.auth.sql
#else
#sudo mysqldump	-uroot	-p123456 -P3306 mtqiushui.auth	>	/sqlRepository/mtqiushui.auth.sql
#fi
#if	[	-f "/sqlRepository/mtqiushui.resources.sql" ]
#then
#sudo	rm	-rf	/sqlRepository/mtqiushui.resources.sql
#mysqldump -uroot -p123456 -P3306 mtqiushui.resources > /sqlRepository/mtqiushui.resources.sql
#else
#sudo mysqldump	-uroot	-p123456 -P3306 mtqiushui.resources	>	/sqlRepository/mtqiushui.resources.sql
#fi

注意:这里首先你要先执行一下这个脚本,看是否报错。

如果报错,很可能是你编译该脚本时格式出错:

解决步骤:

1.sudo vim 脚本名称

2.按键盘的 i 键--然后Esc 终端左下角  :set  ff 

3.如果出现  dos  (就说明你的脚本格式不正确)

4.修改格式  : set ff = unix 回车之后   继续 Esc  :wq 保存

5.如果出现权限问题无法保存    就在 wq后面 加上 !

如果出现synix类似问题.很可能就是你的脚本里面语法有问题,自己检查解决

直至你的脚本运行没问题,再进行后面的步骤。

二丶书写定时配置:

去你的系统  /etc/目录下找到 crontab

1.编译

sudo  vim  crontab

2.书写定时配置

# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user	command
17 *	* * *	root    cd / && run-parts --report /etc/cron.hourly
25 6	* * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6	* * 7	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6	1 * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#我这里是每1小时执行一次
#注意语法格式 后面脚本目录必须 绝对路径 
*/60 *  * * *    root   /sqlRepository/sry.sh  
#

3.定时例子

   每五分钟执行  */5 * * * *

  每小时执行     0 * * * *

  每天执行       0 0 * * *

  每周执行       0 0 * * 0

  每月执行       0 0 1 * *

  每年执行       0 0 1 1 *

三丶根据你的系统可选

我的是Ubuntu 16.04版本,所以我的定时运行日志文件未打开,需要手动打开

另外  我的系统没有那个 service命令插件,需要另外命令进行操作

1.先打开日志,输入命令

sudo vim /etc/rsyslog.d/50-default.conf

2.找到 #cron.*   /var/log/cron.log

将前面那个注释去掉,保存并退出

3.如果系统没有service命令插件,就用我的方式重启,开启,关闭cron服务

#停止
/etc/init.d/cron stop
#开启
/etc/init.d/cron start
#重启
sudo /etc/init.d/cron restart

4.切记,如果修改了crontab这个文件,一定要重启cron服务,否则无效

5.查看定时任务日志文件

tail -f /var/log/cron.log

由此,需求解决~~~~折腾了一天半,很好!又磨练了我的性子。

明知路南偏偏行:

我从来都不会对自己失去一点点信心,因为我就是明知路南偏偏行~

如果有任何问题,欢迎指出来,一块讨论,有疑问加Q:2509647976 微:x331191249

2017-04-16 20:14:33 tianyafeng123xin 阅读数 1745

前言:

对于一个项目维护者来说,数据库维护至关重要,数据丢失绝对是致命的,所以今天抽空加了下在ubuntu通过用户调度任务crontab定时备份数据库的功能,记录下~

1、crontab的简单介绍

crontab命令常用语unix和类unix的操作系统中,用于设置周期性的被执行的指令。通常,crontab存储的指令被守护进程激活,crond常常在后台运行,每一分钟检查是否有预定的作业需要执行。这类作业一般称为cron jobs。

Linux下的任务调度分为两类,系统任务调度和用户任务调度。

系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下的crontab文件中。

用户任务调度:用户定期要执行的工作,比如数据备份等,用户可以根据crontab工具来定制自己的计划任务,在/var/spool/cron/目录下。

2、crontab命令详解

1)、命令格式:crontab [-u user][-e|-l|-r]

其中:-u user:用来设定某个用户的crontab服务,此参数一般由root用户来运行。如果不指定用户则表示当前登录用户的crontab文件

file:file是命令文件的名字,表示将file做为crontab的任务列表文件并载入crontab。如果在命令行中没有指定这个文件,crontab命令将接受标准输入(键盘)上键入的命令,并将它们载入crontab。

-e:编辑某个用户的crontab文件内容

-l:显示某个用户的crontab文件内容

-r:删除某个用户的crontab文件

-i:在删除用户的crontab文件时给确定提示

2)、编辑crontab文件的格式

minute hour day month week command

一共包含6个字段,其中:

minute:表示分钟,范围0到59的任意整数

hour:表示小时,范围0-23的任意整数

day:表示日期,范围1-31的任意整数

month:表示月份,范围1-12的任意整数

week:表示星期,范围0-7的任意整数,其中0和7表示星期日

commang:要执行的命令,可以是系统命令,也可以是自己编辑的脚本文件。


以上非命令字段中还可以使用以下特殊字符:

星号(*):代表所有可能的值

逗号(,):可以用逗号隔开的值指定一个列表范围,例如:“1,2,3”

中杠(-):表示一个整数范围,例如:"2-5"表示“2,3,4,5”

正斜杠(/):表示指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次;*/10:在minute字段中表示每10分钟执行一次。

3、通过sheel脚本添加数据库备份

1)、通过vim创建一个需要定期执行保存数据库备份的sheel脚本并进行保存

#!bin/bash
cd ~/backup/sqlbackup/
Now=$(date '+%Y%m%d%H%M%S')
File=wechat_$Now.sql
sudo musqldump -h host -u root -p'密码' datebaseName > 目录

注意:-p与密码之间不能有空格,不然执行时会提示输入密码

2)、添加sheel脚本可执行权限

sudo chmod +x  XXX.sh:+x有固定含义,表示文件可执行,而后面的XXX表示文件名

3)、通过crontab -e添加任务

第一次进入会提示选择编辑器

Select an editor.  To change later, run 'select-editor'

选择你偏爱的一个即可,这里我选择的是vim base

然后进行添加你的定时任务:如 0 0 */1 * * sudo sh XXX.sh :每一天执行一次XXX.sh脚本进行数据库备份(注意如果0 0是* *的话,则是每天的每小时的每分钟)。

4)、将新增的定时任务加到cron服务中

$ sudo service cron restart

4、清除7天前的sql数据

添加定时任务见上,此处只说明如何编写删除7天前的命令,将其加到指定的sheel脚本中即可:

sudo find /home/ubuntu/backup/sqlbackup/ -mtime +7 -name "*.sql" -exec rm -rf {} \;
其中:find后紧跟想要清除的文件的目录

-mtime +7:表示7天前的时间

“*.sql”:以.sql结尾的文件

-exec rm -rf {} \;:执行文件清除(反斜杠\是分号;的转移符号)



2016-08-11 20:53:48 magoyang 阅读数 4910


Linux的crontab

crontab定时器(包括执行shell)

如果要让unix系统重复,定期做一件事,我们就会用到crontab.

实质上真正去执行每一个重复任务的是cron,cron是的unix家族的一个后台常驻程序,cron是由cron文件来驱动的,crontab只是用来管理cron文件的,比如给cron file里面添加任务,删除任务,文件里记录了要执行的任务,以及其"时间规则"

crontab的作用,正如crontab的man文档中写的: maintain crontab files for individual users 

crontab提供给我们的接口

我们是不需要去直接编辑cron file,修改查看cron file都应该使用crontab


限制用户使用crontab的文件有:/etc/cron.allow /etc/cron.deny 。 
当使用crontab建立工作排程后,将被记录到/var/spool/cron里。 
cron执行的每一项工作都被记录到/varlog/cron里去。
crontab参数:  www.2cto.com  
-u:只有root才可能,帮其他用户建立或移除工作排程。 
-l:查阅crontab的工作内容 
-r:移除所有的crontab的工作内容,移除一项,用-e编辑。

例1:每天12:00给root发信。
[root@lyy etc]# crontab -e     #用vi编辑 
0 12 * * * mail root -s "at 12:00" < /root/.bashrc
每项工作有六个字段分别是:
分钟    小时    日期    月份    周    指令 
0-59    0-23    1-31    1-12    0-7    指令         #0和7都代表星期天
辅助特殊字符:
* (星号)代表任何时刻 
,(逗号)代表分隔时候。如3点与6点 就是3,6 
-(减号)代表一段时间范围内。如:3点到6点 就是3-6 
/n(斜线)n代表数字,即每隔n单位。如每隔五分钟,/5

例2:每隔3分钟,在屏幕输出字符
# crontab -e 
# crontab -l 
*/3 * * * * echo "hello world !!!!!" > /dev/pts/0    #pts/0是用telnet的终端接口

查看一下记录  www.2cto.com  
# cat /var/log/cron
Dec 12 20:27:01 lyy crond[9865]: (root) CMD (echo "hello world !!!!!" &gt; /dev/pts/0) 
Dec 12 20:30:01 lyy crond[9908]: (root) CMD (echo "hello world !!!!!" &gt; /dev/pts/0)

例3:每个星期三下午14:30分发送一个邮件给pc
 crontab -e 
30 14 * * 3 mail pc -s "test" &lt; /home/text.txt
crontab -e 是针对用户的cron设计的,如果是系统例行性任务,只要编辑/etc/crontab文件就可以了。
 
查看/etc/crontab内容
# cat /etc/crontab 
SHELL=/bin/bash        #接口 
PATH=/sbin:/bin:/usr/sbin:/usr/bin    #执行路径搜寻 
MAILTO=root            #以mail发送者 
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    #每个月1号
取消不要的输出项目:把输出的结果以命令重导向到/dev/null
安全检验:由于一些木马以例行命令方式值入,所以可以通过 
检查/var/log/cron来发现。
周与日月不可同时并存
如:  www.2cto.com  
30 12 11 9 5 root echo "just test " #这是错误的写法。
本来以为九月十一号是星期五执行这个任务,但是系统可能会判定每个星期 
五执行一次或每年九月十一号分别执行。

唤醒停机期间的工作任务 anacron
anacron不能取代crontab,它存在目的是处理非24小时在线的linux系统的 crontab的执行。它是以天为单位或在开机后执行,它会检查停机期间的crontab并执行,然后就自动停止了。
 
linux命令:
建立任务crontab -e 
*/1 * * * * echo 'ddd'/var/test.txt 一分钟写一次ddd到test.txt文件中
* * * */1 * sh /var/jboss-4.0.5.GA/server/default/log/temp/delete_log1.sh 一个月运行一次delete_log1.sh脚本
 
sh脚本(delete_log1.sh)
dd=`date -d"1 month ago" +%y-%m`
rm -vf /var/temp/log.20$dd-*     删除当前时间的起一个月的匹配文件

2018-07-01 00:19:53 xc_zhou 阅读数 209

一个定时任务管理器,基于Go语言和beego框架开发。用于统一管理项目中的定时任务,提供可视化配置界面、执行日志记录、邮件通知等功能,无需依赖*unix下的crontab服务。

项目背景

开发此项目是为了解决本人所在公司的PHP项目中定时任务繁多,使用crontab不好管理的问题。我所在项目的定时任务也是PHP编写的,属于整个项目的一部分,我希望能有一个系统可以统一配置这些定时任务,并且可以查看每次任务的执行情况,任务执行完成或失败能够自动邮件提醒开发人员,因此做了这个项目。

功能特点

  • 统一管理多种定时任务。
  • 秒级定时器,使用crontab的时间表达式。
  • 可随时暂停任务。
  • 记录每次任务的执行结果。
  • 执行结果邮件通知。

界面截图

webcron

安装说明

系统需要安装Go和MySQL。

1、安装go语言环境(go1.9.2.linux-amd64.tar.gz):解压缩到路径/usr/local/go

go下载地址:https://dl.gocn.io/

2、 添加环境变量(vi /etc/profile):

export GOROOT=/usr/local/go
export GOBIN=$GOROOT/bin
export PATH=$PATH:$GOBIN
export GOPATH=/usr/local/webcron
export AUTO_GOPATH=1

3、获取源码(如git未安装则会报错)

$ go get github.com/lisijie/webcron

4 打开配置文件 conf/app.conf,修改相关配置(修改任务数和数据库配置 ):

appname = webcron

httpport = 8000

runmode = dev 

# 允许同时运行的任务数

jobs.pool = 50 

# 站点名称

site.name = 定时任务管理器

# 数据库配置

db.host = ip端口(192.168.11.11)

db.user = 用户名

db.password = 密码

db.port = 3306

db.name = dataserver

db.prefix = t_

db.timezone = Asia/Shanghai

# 邮件服务器配置

mail.queue_size = 100

mail.from = no-reply@example.com

mail.host = smtp.example.com

mail.port = 25

mail.user = username

mail.password = your password

5 创建数据库webcron ,再导入install.sql

6 创建数据库表

  $ mysql -u username -p -D webcron < install.sql

7 编译构建webcron

  $  **cd** /usr/local/webcron/src/github.com/lisijie/webcron

  $  go build

8 运行webcron

$**cd** /usr/local/webcron/src/github.com/lisijie/webcron

$ ./webcron 或 $ nohup ./webcron 2>&1 > error.log &

设为后台运行

9 访问

http://localhost:8000

帐号:admin 密码:admin888

参考:https://github.com/lisijie/webcron

#Cron表达式说明
Cron表达式是一个字符串,字符串以空格隔开,分为5或6个域,每一个域代表一个含义,系统支持的表达式格式如下:

Seconds Minutes Hours DayofMonth Month [DayofWeek]

其中 DayofWeek 为可选域。

每一个域可出现的字符如下:

• Seconds: 可出现"* / , -“四个字符,有效范围为0-59的整数
• Minutes: 可出现”* / , -“四个字符,有效范围为0-59的整数
• Hours: 可出现”* / , -“四个字符,有效范围为0-23的整数
• DayofMonth: 可出现”* / , - ?“五个字符,有效范围为0-31的整数
• Month: 可出现”, - * /“四个字符,有效范围为1-12的整数或JAN-DEC
• DayofWeek: 可出现”* / , - ?"五个字符,有效范围为0-6的整数或SUN-SAT两个范围。0表示星期天,1表示星期一, 依次类推

各个字符的含义如下:

• * 表示匹配该域的任意值,假如在Minutes域使用*, 即表示每分钟都会触发事件。
• ? 字符仅被用于天(月)和天(星期)两个子表达式,表示不指定值,当2个子表达式其中之一被指定了值以后,为了避免冲突,需要将另一个子表达式的值设为“?”。
• - 表示范围,例如在Minutes域使用5-20,表示从5分到20分钟每分钟触发一次。
• / 表示起始时间开始触发,然后每隔固定时间触发一次,例如在Minutes域使用5/20,则意味着5分钟触发一次,而25,45等分别触发一次。
• , 表示列出枚举值值。例如:在Minutes域使用5,20,则意味着在5和20分每分钟触发一次。

一些例子:

0 0 10,14,16 * * ? 每天上午10点,下午2点,4点触发 

0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时触发  

0 0 12 ? * WED 表示每个星期三中午12点触发  

0 0 12 * * ? 每天中午12点触发 

0 15 10 ? * * 每天上午10:15触发 

0 15 10 * * ? 每天上午10:15触发 

0 15 10 * * ? * 每天上午10:15触发 

0 * 14 * * ? 在每天下午2点到下午2:59期间的每1分钟触发 

0 0/5 14 * * ? 在每天下午2点到下午2:55期间的每5分钟触发 

0 0/5 14,18 * * ? 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发 

0 0-5 14 * * ? 在每天下午2点到下午2:05期间的每1分钟触发 

0 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44触发 

0 15 10 ? * MON-FRI 周一至周五的上午10:15触发 

0 15 10 15 * ? 每月15日上午10:15触发 

0 15 10 L * ? 每月最后一日的上午10:15触发
没有更多推荐了,返回首页