2013-11-28 15:50:38 donghustone 阅读数 1997
  • Linux操作系统及常用基础命令深入讲解

    本课程为全新马哥linux全套系列课程之一--Linux基础入门和架构了解,从Linux起源,Linux架构和Linux形成历史开始逐步讲解,让你彻彻底底了解Linux的诞生,之后介绍了Linux相关文化和核心组成结构,以及Linux常用命令和基本用法,课程由浅入深,讲授方法受到98%学员一致好评!

    29628 人正在学习 去看看 马永亮

linux下,crond命令可用来定时执行某个脚本,当定时程序用。

用法参考:

http://www.linuxidc.com/Linux/2010-08/27700.htm

2018-01-09 23:23:37 jing5481 阅读数 543
  • Linux操作系统及常用基础命令深入讲解

    本课程为全新马哥linux全套系列课程之一--Linux基础入门和架构了解,从Linux起源,Linux架构和Linux形成历史开始逐步讲解,让你彻彻底底了解Linux的诞生,之后介绍了Linux相关文化和核心组成结构,以及Linux常用命令和基本用法,课程由浅入深,讲授方法受到98%学员一致好评!

    29628 人正在学习 去看看 马永亮
linux定时运行命令
1.命令简介
每个用户都有各自不同的计划任务列表,用各自的帐户登录后运行


crontab -l
就可查看到各任务的计划任务情况,使用下列命令可以修改自己的计划任务


crontab -e
每次添加完任务后,一定记得重新启动crond服务,不然不会生效


service crond restart
2.实例
下面为一计划任务的样例


#每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点 
0 11 4 * mon-wed date
上面这句的意思是“每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点显示时间”,你把date改成你想执行的命令,再把执行的时间改了,就可以形成一个定时执行命令了


#每分钟执行一次
*/1 * * * * date
#在/root/run_sh/下面写一个shell脚本,命名为run.sh,内容如下
#!/bin/sh
echo hello > /root/Hello.txt
然后运行crontab -e命令,写入


*/1 * * * * /root/run_sh/run.sh(一定要绝对路径)
保存退出后执行service crond restart,过一分钟后你就会在/root下看到Hello.txt文件。


#定时运行java程序,写一命名为run.sh的shell脚本,内容如下
#!/bin/sh
cd /root/javaExe/
java TestCron/Test
后运行crontab -e 写入
*/1 * * * * /root/run_sh/run.sh(一定要绝对路径)
后重启crond服务。
3.空格之间的参数意义如下
分钟   小时   天   月   星期   要执行的命令
前面五个参数中间用空格隔开,最后是要执行的命令。

详细的请参考下面
Crontab是一个很方便的在unix/linux系统上定时(循环)执行某个任务的程序
使用cron服务,用 service crond status 查看 cron服务状态,如果没有启动则 service crond start启动它,
cron服务是一个定时执行的服务,可以通过crontab 命令添加或者编辑需要定时执行的任务:
crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数
crontab -l //列出某个用户cron服务的详细内容
crontab -r //删除没个用户的cron服务
crontab -e //编辑某个用户的cron服务
比如说root查看自己的cron设置:crontab -u root -l
再例如,root想删除fred的cron设置:crontab -u fred -r
在编辑cron服务时,编辑的内容有一些格式和约定,输入:crontab -u root -e
进入vi编辑模式,编辑的内容一定要符合下面的格式:*/1 * * * * ls >> /tmp/ls.txt
编辑/etc/crontab文件,在末尾加上一行: 30 5 * * * root init 6 这样就将系统配置为了每天早上5点30自动重新启动。
需要将crond设置为系统启动后自动启动的服务,可以在/etc/rc.d/rc.local 中,在末尾加上


service crond start
如果还需要在系统启动十加载其他服务,可以继续加上其他服务的启动命令。
比如:


service mysqld start
基本用法:
1. crontab -l
列出当前的crontab任务
2. crontab -d
删除当前的crontab任务
3. crontab -e (solaris5.8上面是 crontab -r)
编辑一个crontab任务,ctrl_D结束
4. crontab filename
以filename做为crontab的任务列表文件并载入
crontab file的格式:
crontab 文件中的行由 6 个字段组成,不同字段间用空格或 tab 键分隔。前 5 个字段指定命令要运行的时间
分钟 (0-59)
小时 (0-23)
日期 (1-31)
月份 (1-12)
星期几(0-6,其中 0 代表星期日)
第 6 个字段是一个要在适当时间执行的字符串
例子:


#MIN HOUR DAY MONTH DAYOFWEEK COMMAND
#每天早上6点10分
10 6 * * * date
#每两个小时
0 */2 * * * date (solaris 5.8似乎不支持此种写法)
#晚上11点到早上8点之间每两个小时,早上8点
0 23-7/2,8 * * * date
#每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 11 4 * mon-wed date
#1月份日早上4点
0 4 1 jan * date
补充:在使用crontab的时候,要特别注意的是运行脚本中能够访问到的环境变量和当前测试环境中的环境变量未必一致,一个比较保险的做法是在运行的脚本程序中自行设置环境变量(export)
(1)先建一个文件crond.txt如下, 每天早上5点36分重新启动
36 5 * * * reboot
(2)上传到/opt目录
(3)运行命令
crontab /opt/crond.txt
crontab -l
让配置文件生效:如果让配置文件生效,还得重新启动cron,切记,既然每个用户下的cron配置文件修改后。也要重新启动cron服务器。
在Fedora 和Redhat中,我们应该用;
[root@localhost ~]# /etc/init.d/crond restart
如果让crond 在开机时运行,应该改变其运行级别;
[root@localhost ~]# chkconfig --levels 35 crond on
service crond status 查看 cron服务状态,如果没有启动则 service crond start启动它, cron服务是一个定时执行的服务,可以通过crontab 命令添加或者编辑需要定时执行的任务

下面是一个例子文件:


#MIN HOUR DAY MONTH DAYOFWEEK COMMAND
#每天早上6点
106* * * date
#每两个小时
0*/2* * * date
#晚上11点到早上8点之间每两个小时,早上部点
0 23-7/2,8* * * date
#每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 11 4* mon-wed date
#1月份日早上4点
0 4 1 jan* date
范例
lark:~>crontab-1 列出用户目前的crontab.
#MIN HOUR DAY MONTH DAYOFWEEK COMMAND
10 6* * * date
0*/2* * * date
0 23-7/2,8 * * * date
lark:~>
基本格式 :
*****command
分   时   日   月   周   命令
第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令
crontab文件的一些例子:


30 21 * * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每晚的21:30重启lighttpd 。</p> <p>45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每月1、10、22日的4 : 45重启lighttpd 。</p> <p>10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每周六、周日的1 : 10重启lighttpd 。</p> <p>0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示在每天18 : 00至23 : 00之间每隔30分钟重启lighttpd 。</p> <p>0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每星期六的11 : 00 pm重启lighttpd 。</p> <p>* */1 * * * /usr/local/etc/rc.d/lighttpd restart
每一小时重启lighttpd</p> <p>* 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart
晚上11点到早上7点之间,每隔一小时重启lighttpd</p> <p>0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart
每月的4号与每周一到周三的11点重启lighttpd</p> <p>0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart
一月一号的4点重启lighttpd
2018-11-10 19:56:32 qq_42197548 阅读数 284
  • Linux操作系统及常用基础命令深入讲解

    本课程为全新马哥linux全套系列课程之一--Linux基础入门和架构了解,从Linux起源,Linux架构和Linux形成历史开始逐步讲解,让你彻彻底底了解Linux的诞生,之后介绍了Linux相关文化和核心组成结构,以及Linux常用命令和基本用法,课程由浅入深,讲授方法受到98%学员一致好评!

    29628 人正在学习 去看看 马永亮

Crontab-定时执行命令

  • 每分钟需要执行一个程序去检查系统运行状态
  • 每天凌晨需要对过去的一天业务数据进行统计
  • 每个星期需要把日志文件备份(如果日志信息太多那么占用的磁盘空间就会越大,而且日志我们大多都是实时分析一周之内的日志信息,而超出一周的日志我们会将它进行备份)每天凌晨两三点钟进行备份
  • 每个月需要把数据库进行备份

单个用户的计划任务—>(单一一次的计划任务,周期性的计划任务)
系统级别的计划任务—> (大多是周期性的计划任务)
单一一次的计划任务—> at
周期性的计划任务—> 创建 cron表,通过命令crontab -e来创建

案例1:
man at
at–定义计划任务
atq --查看计划任务
atrm --删除计划任务
使用方法:
#at now + 2 minutes

输入要执行的命令
ctrl+d 结束输入
#atq (注意 当你这个计划任务执行后再次查看就没有显示了)
#ll /var/spool/at 当计划任务没有执行会在该目录下产生一个普通文件,但是执行后该位置的文件也就不在了
#atrm 3 (删除的是通过atq查看的计划任务编号)
at指定某一个准确的时间点
#at 10:52 Apr 22
周期性永久生效:编辑cron表,通过命令crontab来管理
#crontab -e 添加cron表 (注意:当计划任务表格式写的有问题就不能正常退出)
文件格式是 :

          • 执行周期性任务
            格式说明:
          • 分 时 日 月 周(五个*号的作用)

0-59 0-23 1-31 1-12 0-6

minute:表示分钟,可以是从0到59之间的任何整数。
hour:表示小时,可以是从0到23之间的任何整数。
day:表示日期,可以是从1到31之间的任何整数。
month:表示月份,可以是从1到12之间的任何整数。
week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。
command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。

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

案例2:
#每天周三的两点零六分执行一个脚本
06 02 * * 03 wall haha
#每天中午12点
*12 * * * wall hehe
#每一分钟执行
*/1 * * * wall xixi

[root@localhost var]# cd /var/spool/cron
[root@localhost cron]# ll    //为什么会周期执行原因是写好这个计划会在该目录下

有一个和该用户名相同的文件执行后不会移出

-rw-------. 1 root root 22 920 15:56 root

#crontab -l 显示我的计划任务
#crontab -r 清除我的所有计划任务列表

案例3:
指定某些用户可以执行计划任务
对于普通用户设置计划任务,但我们也可以设置哪些用户可以设置计划任务哪些用户不可以

[root@localhost ~]# vim /etc/at.deny 
//redhat (将不可以执行的计划任务的用户写上就好)
[root@localhost ~]# su - redhat
[redhat@localhost ~]$  at now + 1minutes
You do not have permission to use at.

注意:在系统中并没有at.allow这个文件但只要你编辑这个文件再次允许你这个用户
可以编写计划任务也是可以的。系统默认先是看你允许的

[root@localhost ~]# vim /etc/at.allow
redhat

同样:

vim /etc/cron.deny     vim /etc/cron.allow

案例四
针对系统用户

[root@localhost 桌面]#systemctl restart crontab
[root@localhost 桌面]# vim  /etc/crontab
SHELL=/bin/bash              //运行计划所使用的shell 默认是bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin     //指定命令执行环境变量路径
MAILTO=root            // MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给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
05   03  * * *  run-parts /etc/cron.daily

注意:当我们需要在同一时间执行的个脚本时候避免多次写可以用 run-parts来执行
run-parts: 是一个脚本在/usr/bin/run-parts 作用就是执行一个目录下的所有脚本/程序
解释: crontab -e 和 /etc/crontab 区别
crontab -e 是当前用户自定义的,只针对当前用户生效,/etc/crontab 是针对系统所有用户生效的

案例5:
扩展计划任务:
假设当你的计划任务应该在某个时间点执行,但由于一些因素(断电)没有执行那么这个计划任务还执不执行,什么时候执行?
会在开机以后会开机检查 计划任务哪些执行哪些没有执行,然后在指定时间内去执行

#vim /etc/anacrontab
#period in days   delay in minutes   job-identifier   command
1       5       cron.daily              nice run-parts /etc/cron.daily
7       25      cron.weekly             nice run-parts /etc/cron.weekly
@monthly 45     cron.monthly            nice run-parts /etc/cron.monthly

(每一天开机以后5分钟去检查cron.daily这个脚本)

创作者:Eric· Charles

2017-01-08 19:23:39 u013063153 阅读数 3421
  • Linux操作系统及常用基础命令深入讲解

    本课程为全新马哥linux全套系列课程之一--Linux基础入门和架构了解,从Linux起源,Linux架构和Linux形成历史开始逐步讲解,让你彻彻底底了解Linux的诞生,之后介绍了Linux相关文化和核心组成结构,以及Linux常用命令和基本用法,课程由浅入深,讲授方法受到98%学员一致好评!

    29628 人正在学习 去看看 马永亮

Linux中,周期执行的任务一般由cron这个守护进程来处理  ps -ef | grep cron 

cron读取一个或多个配置文件,这些配置文件中包含了命令行及其调用时间。

cron的配置文件称为“crontab”,是“cron table”的简写。

一、 cron在3个地方查找配置文件(设置shell脚本):

1、/var/spool/cron/yanggang 这个目录下存放的是每个用户(包括root)的crontab任务,每个任务以创建者的名字命名,比如用户tom建的crontab任务对应的文件就是/var/spool/cron/tom

 yanggang@barry$ sudo ls -l /var/spool/cron/(或有时是 /var/spool/cron/crontabs/
-rw------- 1 root     crontab 1071 2011-09-19 17:20 root

-rw------- 1 yanggang crontab 1176 2011-09-24 11:07 yanggang

一般一个用户最多只有一个crontab文件(如:root, yanggang等),其对应日志在/var/spool/mail/root(或/var/spool/mail/yanggang)文件里


2、/etc/crontab 这个文件负责安排由系统管理员制定的维护系统以及其他任务的crontab。
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# .---------------- 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 
# |  |  |  |  |
# *  *  *  *  *  command to be executed

例如:

*/5 * * * * root /usr/libexec/atrun

minute:代表一小时内的第几分,范围 0-59。 
hour:代表一天中的第几小时,范围 0-23。 
mday:代表一个月中的第几天,范围 1-31。 
month:代表一年中第几个月,范围 1-12。 
wday:代表星期几,范围 0-7 (0及7都是星期天)。 
who:要使用什么身份执行该指令,当您使用 crontab -e 时,不必加此字段。 
command:所要执行的指令。 


3、/etc/cron.d/ 这个目录用来存放任何要执行的crontab文件或脚本。



二、 权限
crontab权限问题到/var/adm/cron/下一看,文件cron.allow和cron.deny是否存在
用法如下: 
1、如果两个文件都不存在,则只有root用户才能使用crontab命令。 
2、如果cron.allow存在但cron.deny不存在,则只有列在cron.allow文件里的用户才能使用crontab命令,如果root用户也不在里面,则root用户也不能使用crontab。 
3、如果cron.allow不存在, cron.deny存在,则只有列在cron.deny文件里面的用户不能使用crontab命令,其它用户都能使用。 
4、如果两个文件都存在,则列在cron.allow文件中而且没有列在cron.deny中的用户可以使用crontab,如果两个文件中都有同一个用户,
以cron.allow文件里面是否有该用户为准,如果cron.allow中有该用户,则可以使用crontab命令。 


AIX 中 普通用户默认都有 crontab 权限,如果要限制用户使用 crontab ,就需要编辑/var/adm/cron/cron.deny 
HP-UNIX 中默认普通用户没得crontab 权限 ,要想放开普通用户的crontab 权限可以编


三、 创建cron脚本

第一步:写cron脚本文件,命名为crontest.cron。
15,30,45,59 * * * * echo "xgmtest....." >> xgmtest.txt  表示,每隔15分钟,执行打印一次命令 
第二步:添加定时任务。执行命令 “crontab crontest.cron”。搞定 
第三步:"crontab -l" 查看定时任务是否成功或者检测/var/spool/cron下是否生成对应cron脚本



四、 cron服务
  cron是一个linux下 的定时执行工具,可以在无需人工干预的情况下运行作业。
  /sbin/service crond start    //启动服务
  /sbin/service crond stop     //关闭服务
  /sbin/service crond restart  //重启服务
  /sbin/service crond reload   //重新载入配置
  /sbin/service crond status   //查看服务状态 

例如: 使用sudo停止与启动服务

yanggang@barry$sudo service cron stop
cron stop/waiting
yanggang@barry$ sudo service cron start
cron start/running, process 7502



五、 crontab用法 
crontab命令用于安装、删除或者列出用于驱动cron后台进程的表格,用户把需要执行的命令序列放到crontab文件中以获得执行。
每个用户都可以有自己的crontab文件,/var/spool/cron下的crontab文件不可以直接创建或者直接修改,该crontab文件是通过crontab -e命令创建的

在crontab文件中如何输入需要执行的命令和时间,该文件中每行都包括六个域,其中前五个域是指定命令被执行的时间,最后一个域是要被执行的命令。
    每个域之间使用空格或者制表符分隔。格式如下: 
      minute hour day-of-month month-of-year day-of-week commands 
合法值 00-59 00-23 01-31 01-12 0-6 (0 is sunday) 

除了数字还有几个个特殊的符号就是"*"、"/"和"-"、",",*代表所有的取值范围内的数字

"/"代表每的意思,"/5"表示每5个单位,"-"代表从某个数字到某个数字,","分开几个离散的数字。

-l 在标准输出上显示当前的crontab。 

-r 删除当前的crontab文件。 

-e 使用VISUAL或者EDITOR环境变量所指的编辑器编辑当前的crontab文件。

当结束编辑离开时,编辑后的文件将自动安装。 



几个例子: 
每天早上6点 
0 6 * * * echo "Good morning." >> /tmp/test.txt //注意单纯echo,从屏幕上看不到任何输出,因为cron把任何输出都email到root的信箱了。

每两个小时 
0 */2 * * * echo "Have a break now." >> /tmp/test.txt  

晚上11点到早上8点之间每两个小时和早上八点 
0 23-7/2,8 * * * echo "Have a good dream" >> /tmp/test.txt

每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点 
0 11 4 * 1-3 command line

1月1日早上4点 
0 4 1 1 * command line SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root //如果出现错误,或者有数据输出,数据作为邮件发给这个帐号 HOME=/ 

每小时(第一分钟)执行/etc/cron.hourly内的脚本
01 * * * * root run-parts /etc/cron.hourly


每天(凌晨4:02)执行/etc/cron.daily内的脚本

02 4 * * * root run-parts /etc/cron.daily 


每星期(周日凌晨4:22)执行/etc/cron.weekly内的脚本

22 4 * * 0 root run-parts /etc/cron.weekly 


每月(1号凌晨4:42)去执行/etc/cron.monthly内的脚本 

42 4 1 * * root run-parts /etc/cron.monthly 


注意:  "run-parts"这个参数了,如果去掉这个参数的话,后面就可以写要运行的某个脚本名,而不是文件夹名。   


每天的下午4点、5点、6点的5 min、15 min、25 min、35 min、45 min、55 min时执行命令。 
5,15,25,35,45,55 16,17,18 * * * command

每周一,三,五的下午3:00系统进入维护状态,重新启动系统。
00 15 * *1,3,5 shutdown -r +5

每小时的10分,40分执行用户目录下的innd/bbslin这个指令: 
10,40 * * * * innd/bbslink 

每小时的1分执行用户目录下的bin/account这个指令: 
1 * * * * bin/account

每天早晨三点二十分执行用户目录下如下所示的两个指令(每个指令以;分隔): 
203 * * * (/bin/rm -f expire.ls logins.bad;bin/expire$#@62;expire.1st)  

每年的一月和四月,4号到9号的3点12分和3点55分执行/bin/rm -f expire.1st这个指令,并把结果添加在mm.txt这个文件之后(mm.txt文件位于用户自己的目录位置)。 

12,553 4-91,4 * /bin/rm -f expire.1st$#@62;$#@62;mm.txt 


六、几个问题

crond 进程没有运行

1. 启动crond进程

/etc/init.d/crond start


2. 开机自启动crond进程

chkconfig crond on


crontab 编辑:
输入编辑命令: crontab -e

# m h  dom mon dow   command
SHELL=/bin/bash
30 * * * * cd /home/barry/top800/top10/top10_fruits/ && ./top10_all.sh

Ctrl + O (写入)——》enter键(保存文件名)——》Ctrl + X(退出) 

输入查看命令: crontab -l

# m h  dom mon dow   command
SHELL=/bin/bash
30 * * * * cd /home/barry/top800/top10/top10_fruits/ && ./top10_all.sh
建议使用此方式

语法错误:

Syntax error: "(" unexpected  

参见: LINUX - BASH Syntax Error

或者,crontab -e 时指定shell解释器(sh):SHELL=/bin/bash(请参见上面 crontab编辑 示例)


路径错误:

在 /var/spool/crontab/yanggang 中,添加了如下命令,在日志文件 /var/spool/mail/yanggang 中提示找不到 xxx.sh 路径

30 * * * *  /home/barry/top800/top10/top10_fruits/top10_all.sh

30 * * * * bash /home/barry/top800/top10/top10_fruits/top10_all.sh

这是因为你在crontab中使用了绝对路径执行脚本 top10_all.sh,因此在脚本 top10_all.sh 中引用的其它脚本也都需要使用绝对路径,才能被crontab找到并执行

如何避免绝对路径复杂的设置呢,如上文 六、几个问题  示,采用如下格式:

30 * * * * cd /home/barry/top800/top10/top10_fruits/ && ./top10_all.sh建议使用此方式,先进入该目录,然后在执行脚本;否则,执行脚本中的其它脚本都需要加绝对路径



推荐参考:

linux定时运行命令脚本 (crontab详解)

linux crontab 计划任务

How to set-up a crontab file


原文链接:http://blog.csdn.net/ithomer/article/details/6817019


2016-12-23 11:28:16 wyz365889 阅读数 5233
  • Linux操作系统及常用基础命令深入讲解

    本课程为全新马哥linux全套系列课程之一--Linux基础入门和架构了解,从Linux起源,Linux架构和Linux形成历史开始逐步讲解,让你彻彻底底了解Linux的诞生,之后介绍了Linux相关文化和核心组成结构,以及Linux常用命令和基本用法,课程由浅入深,讲授方法受到98%学员一致好评!

    29628 人正在学习 去看看 马永亮

Learn from one's mistakes!

经历过坑坑,就会吃一堑长一智!错误使我们快速成长!

对crontab的基础了解:

利用crontab可以在linux上面创建定时任务工作,该工作会被记录到/var/spool/cron里面去,该记录已帐号为区分,不信你可以执行下面命令进去看下:

[root@ccw cron]# cd /var/spool/cron/
[root@ccw cron]# ls
root


crontab的执行定时任务的记录会写入到/var/log/cron这个文件中,不信你可以用下面命令查看

[root@ccw ~]# tail -f /var/log/cron

crontab的执行最低频率是一分钟,cron 会每分钟去读取一次 /etc/crontab 与 /var/spool/cron 里面的数据内容

crontab的基本命令操作:

crontab命令主要有3个参数:

  -e :编辑用户的crontab。执行crontab -e命令后就可以在里面编写定时任务执行命令;例子:

执行 crontab -e

# 此时会进入 vi 的编辑画面让您编辑工作!注意到,每项工作都是一行。

#分 时 日  月 周      任务的完整命令行

 *  *  *  *  *       /www/task.sh

  -l :列出用户的crontab的内容。

  -r :删除用户的crontab的内容。

查看crontab服务状态:service crond status

手动启动crontab服务:service crond start;一般不需要重新启动,但有些系统比较另类,就需要了!

走坑一:linux系统时间不正常,定时任务死活执行不了

php测试脚本执行没错,结果放到crontab里面就不行了;查了N久,结果坑比,因为php测试脚本有个时间对比,时间大于某个点(2016-12-13 9:00:00)就开始执行,由于系统时间没跟网络时间同步是错误的,结果测试的时候一直小于时间点(2016-12-13 9:00:00

跳坑方法,同步系统时间为网络时间,执行命令如下:

ntpdate cn.pool.ntp.org
hwclock -w

走坑二:环境变量引起,shell脚本单独执行ok,定时任务死活执行不了

写了个备份mysql数据库的脚本shell,单独执行没任务问题;但是放到crontab执行就不行了

跳坑方法,在shell脚本之前,执行下系统环境生效,如下:

#!/bin/sh
source /etc/profile


走坑三:执行权限设置引起,shell脚本没执行权限

跳坑方法:对需要执行的脚本执行命令:chmod +x  xx.shell

走坑四:执行定时任务重复执行

跳坑方法:需要加锁机制或者脚本自己处理

使用linux flock 文件锁实现任务锁定,解决冲突;当任务未执行完,则不会进行下一次任务执行。例子:

* * * * * flock -xn /tmp/mytest.lock -c 'php /home/test.php' 
flock命令详解如下:

-s, --shared:    获得一个共享锁  
-x, --exclusive: 获得一个独占锁  
-u, --unlock:    移除一个锁,通常是不需要的,脚本执行完会自动丢弃锁  
-n, --nonblock:  如果没有立即获得锁,直接失败而不是等待  
-w, --timeout:   如果没有立即获得锁,等待指定时间  
-o, --close:     在运行命令前关闭文件的描述符号。用于如果命令产生子进程时会不受锁的管控  
-c, --command:   在shell中运行一个单独的命令  
-h, --help       显示帮助  
-V, --version:   显示版本















Linux定时执行php

阅读数 277

没有更多推荐了,返回首页