今天在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
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: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。
/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
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到服务器上进行操作的童鞋来说,命令行还是最好(唯一)的工具。