关于ubuntu中利用crontab设置定时任务的问题

汉王 ubuntu 2016年10月25日 收藏

今天在ubuntu中利用crontab设置定时执行脚本的过程中,发现设置没有出错,单独运行脚本也没有问题,但是总是定时运行失败。查阅很多文件之后发现:因为crontab可能有时候没有办法执行用户家目录下面的两个文件,分别是.bashrc和.bash_profile。

意思是说,我们在设置crontab定时执行脚本时,要将用到的环境变量添加进脚本中。列:

#!/bin/bash 
export JAVA_HOME=/home/infocenter/jdk1.7.0_75
export JRE_HOME=/home/infocenter/jdk1.7.0_75/jre
export PATH=$JAVA_HOME/bin:$PATH

Cron定时执行带参数的PHP代码

 一,依然使用php脚本执行。

command 命令行填写:php /home/piaoyi.org/public_html/cron.php q1 q2

然后,在cron.php页面使用  $argv[1] 来获取 q1 第一个参数值, $argv[2] 获取第二个参数 q2 的值; $argv[0] 的值是路径及文件名,在这里为:/home/piaoyi.org/public_html/cron.php

二,使用wget命令。

wget:Linux下的一个非交谈式的网路抓档工具。

command命令行填写:

wget -d http://www.piaoyi.org/cron1.php?q1=11/&q2=22

注意:

wget的用法: wget [选项] [URL]

选项:-d, --debug  显示出错的输出,即调试模式; -q, --quiet  安静模式(不输入任何讯息)。

当使用 -d 参数时,cron定时任务依然会给你发送调试信息的邮件,当你使用 -q 参数是,系统不会给你发送cron执行情况的邮件。如果你想静默的方式,你可以使用: 

wget -q http://www.piaoyi.org/cron1.php?q1=11/&q2=22

wget方法中URL传递多个参数的时候,&符号需要转义(反正我没有转换可以运行),即 /& ;另外,需要使用绝对路径的URL。

三,curl 方式

/usr/bin/curl 'http://www.piaoyi.org/cron1.php?q=11/&b=22' > /dev/null

计划任务语法的图表

# +---------------- 分钟minute (0 - 59)
# |  +------------- 时hour (0 - 23)
# |  |  +---------- 日day of month (1 - 31)
# |  |  |  +------- 月month (1 - 12)
# |  |  |  |  +---- 周的某天day of week (0 - 7) (星期天Sunday=0 or 7)
# |  |  |  |  |
  *  *  *  *  *  要执行的命令

实例代码

0 * * * * wget -O - -q -t 1 http://www.example.com/cron.php

上面的例子中, 参数0 * * * *代表任务将要执行的时间. 第一个数字代表分钟——在这个例子中, 是在零分钟时, 或指定小时的开始. (如果这个数字是10, 那么指定的动作会在小时过后10分钟开始运行.) 其它数字含义, 分别是, 小时, 日, 月份 和 某周的某天. 一个 *是一个通配符, 表示 "每一个时间."

这一行剩下的参数主要告诉服务器请求url http://www.example.com/cron.php (link is external), 然后服务器运行cron.php代码. 注意: -O 是 "破折号 大写字母O", 不是"破折号零". 当然, 大写O很重要. 如果写成小写o将不会运行。

45 * * * *  /usr/bin/lynx -source http://example.com/cron.php (link is external) 
45 * * * * /usr/bin/wget -O - -q -t 1 http://www.example.com/cron.php (link is external)
45 * * * * curl --silent --compressed http://example.com/cron.php (link is external)

这条指令会在每小时的45分时使用lynx (link is external), wget (link is external)或curl (link is external)放问你的cron页面。

提供三种方式是为防止你的服务器是可能没有安装wget、lynx或curl, 任何一种方式都是可以正常工作的。

经常创建计划任务时可以到这个地址了解更多的定时任务文件(crontab file)的语法 (link is external)(英文)。

有很多方法可以配置一个计划任务工作(cron job). 如果你有操作定时任务的全部权限,就可以简单的把上面例子中的命令粘贴一条到定时任务文件中 – 请确保将"example.com"替换为你自己的域名或文件根路径。

如果你使用的是共享的虚拟主机,你应该能在主机控制面版中的某处找到定时计划工作配置。一些主机对于不熟悉cron的会提供cron向导来引导你完成cron配置。在win系统中可以使用计划任务工具运行IE浏览器指向你的URL来完成相同的工作。

有些主机商不允许本地环回接口(local loopback)的运行, 那么使用wget, curl 或 lynx 的命令就不能工作。 如果出现这种情况, 并且他们运行PHP作为公共网关接口(CGI) (可以检查你的主机提代商配置看下是不是这种情况), 就可以使用下面的命令运行

cron :-/usr/bin/php /home/sites/example.com/public_html/cron.php

关于crontab的用法:

cron是一个Linux下的后台进程,用来定期的执行一些任务。因为我用的是Ubuntu,所以这篇文章中的所有命令也只能保证在Ubuntu下有效,但其他系统应该也差不多。

 想要让cron执行你指定的任务,首先就要编辑crontab文件。crontab是一个文本文件,用来存放你要运行的命令。你可以以下命令

crontab -e

 来打开你的用户所属的crontab文件。第一次用这个命令,会让你选择文本编辑器,我选的是vim。选定的编辑器也可以使用

select-editor

 命令来更改。这点命令行中已经有足够的提示,就不多说了。

 打开后的crontab文件类似这种样子:

# m h  dom mon dow   command  
*/2 * * * * date >> ~/time.log

 第二行是我为了测试写的一个定期任务,它的意思是,每隔两分钟就执行 date >> ~/time.log 命令(记录当前时间到time.log文件)。你可以把它加入你的crontab中,然后保存退出。

 

保存了crontab之后,我们还需要重启cron来应用这个计划任务。使用以下命令:

sudo service cron restart

下面稍微解释下crontab中每行的含义。crontab中的每一行代表一个定期执行的任务,分为6个部分。前5个部分表示何时执行命令,最后一个部分表示执行的命令。每个部分以空格分隔,除了最后一个部分(命令)可以在内部使用空格之外,其他部分都不能使用空格。前5个部分分别代表:分钟,小时,天,月,星期,每个部分的取值范围如下:

分钟          0 - 59
小时          0 - 23
天            1 - 31
月            1 - 12
星期          0 - 6       0表示星期天

除了这些固定值外,还可以配合星号(*),逗号(,),和斜线(/)来表示一些其他的含义:

星号          表示任意值,比如在小时部分填写 * 代表任意小时(每小时)

逗号          可以允许在一个部分中填写多个值,比如在分钟部分填写 1,3 表示一分钟或三分钟

斜线          一般配合 * 使用,代表每隔多长时间,比如在小时部分填写 */2 代表每隔两分钟。所以 */1 和 * 没有区别

                  */2 可以看成是能被2整除的任意值。

 以下是一些例子(省略了命令部分):

* * * * *                  # 每隔一分钟执行一次任务  
0 * * * *                  # 每小时的0点执行一次任务,比如6:00,10:00  
6,10 * 2 * *            # 每个月2号,每小时的6分和10分执行一次任务  
*/3,*/5 * * * *          # 每隔3分钟或5分钟执行一次任务,比如10:03,10:05,10:06

以上就是在cron中加入计划任务的基本知识。因为cron中的任务基本就是执行命令行,所以当然也会有权限问题。以上例子中的任务就是以你当前登录用户的权限执行的,如果你需要以root用户执行某个任务,可以在crontab前加上sudo。

sudo crontab -e

再顺带一提,不喜欢命令行的童鞋可以去 Ubuntu软件中心 下一个 计划任务 程序。在软件中心中搜索 schedule 就可以搜到。它是一个GUI的程序,做的还蛮傻瓜化的。不过好像没办法设置成使用root用户运行任务。而且,对于要ssl到服务器上进行操作的童鞋来说,命令行还是最好(唯一)的工具。