在dotcloud上使用crontab执行定时任务跟其他Linux上使用没什么区别。只要注意好路径和权限,一般使用绝对路径为上。

crontab遵从以下格式:
分 时 日 月 星期 要运行的命令
crontab [-u username] -e -l -r
-e 编辑crontab文件
-l 列出crontab文件的内容
-r 删除crontab文件
——————————————-

30 21 * * * /apps/bin/clear.sh
0,30 18-23 * * * /apps/bin/dbcheck.sh
每天18-23点之间每三十分钟运行一次
——————————————-
提交crontab
创建一个davecron文件
写入
50,51,52, 18 * * * /bin/echo `date` >/dev/console
使用#注释cron脚本
$ crontab davecron
新建的文件副本会放置在/var/spool/cron目录内,文件名为对应的用户名

比如在有一个路径为“/home/dotcloud/mydjango/hello/weather/cron.py“的python 脚本

使用crontab -e后进入vi编辑

每三分钟执行一次:
*/3 * * * * python /path/to/cron.py

需要在整点每个小时执行一次。
0 * * * * python /path/to/cron.py

更多用法参考:http://linux.vbird.org/linux_basic/0430cron.php

===============================================
关键的问题不在于cron的用法,而在于蛋疼的python路径。因为dotcloud是使用virtualEnv的python解析器来执行Web脚本。通过 which python 命令可以得到这个的路径,如果采用*/3 * * * * python /path/to/cron.py的写法,会出现找不到package包路径的问题。因为这里的python解析器是系统默认的解析。通过pip或easy_install安装的模块 (如django) 就找不到了。

知道原因,尝试使用下面的解决方法。

1. crontab里的python解析器换成virtualEnv下的python解析器路径,报错。
*/3 * * * * /home/dotcloud/env/bin/python /path/to/cron.py

2. 把cron.py设置可执行权限,并在首行加入!#/home/dotcloud/env/bin/python, 报错

最后使用最无奈的方法解决,打开一个python shell, 输入 :

import django
django.__file__

记下这个路径,其实就是virtualEnv下python第三方安装包所在的目录,然后在cron.py硬编码这个目录到系统路径。写法比较dirty,只能作暂时性解决办法。代码如下:

package_dir = ‘/home/dotcloud/env/lib/python2.6/site-packages’
sys.path.append(package_dir)

最后发现另外一种做法,可以设置PYTHON_PATH系统变量的解决方法,未测试

————————————————————————————–
另外使用路径时最后是用__file__取当前(类似PHP的__FILE__常量)作为基准处理其他文件和路径。如:

dir = os.path.dirname(__file__)
settings_dir = os.path.abspath(os.path.join(dir,os.path.pardir))
if settings_dir not in sys.path :
sys.path.append(settings_dir)

————————————————————————————–

由此可见,crontab是很傻的,所以处理路径问题时要非常小心。

最后crontab写法:其实在dotcloud上使用crontab执行定时任务跟其他Linux上使用没什么区别。只要注意好路径和权限,一般使用绝对路径为上。

crontab遵从以下格式:
分 时 日 月 星期 要运行的命令
crontab [-u username] -e -l -r
-e 编辑crontab文件
-l 列出crontab文件的内容
-r 删除crontab文件
——————————————-

30 21 * * * /apps/bin/clear.sh
0,30 18-23 * * * /apps/bin/dbcheck.sh
每天18-23点之间每三十分钟运行一次
——————————————-
提交crontab
创建一个davecron文件
写入
50,51,52, 18 * * * /bin/echo `date` >/dev/console
使用#注释cron脚本
$ crontab davecron
新建的文件副本会放置在/var/spool/cron目录内,文件名为对应的用户名

比如在有一个路径为“/home/dotcloud/mydjango/hello/weather/cron.py“的python 脚本

使用crontab -e后进入vi编辑

每三分钟执行一次:
*/3 * * * * python /path/to/cron.py

需要在整点每个小时执行一次。
0 * * * * python /path/to/cron.py

更多用法参考:http://linux.vbird.org/linux_basic/0430cron.php

===============================================
关键的问题不在于cron的用法,而在于蛋疼的python路径。因为dotcloud是使用virtualEnv的python解析器来执行Web脚本。通过 which python 命令可以得到这个的路径,如果采用*/3 * * * * python /path/to/cron.py的写法,会出现找不到package包路径的问题。因为这里的python解析器是系统默认的解析。通过pip或easy_install安装的模块 (如django) 就找不到了。

知道原因,尝试使用下面的解决方法。

1. crontab里的python解析器换成virtualEnv下的python解析器路径,报错。
*/3 * * * * /home/dotcloud/env/bin/python /path/to/cron.py

2. 把cron.py设置可执行权限,并在首行加入!#/home/dotcloud/env/bin/python, 报错

最后使用最无奈的方法解决,打开一个python shell, 输入 :

import django
django.__file__

记下这个路径,其实就是virtualEnv下python第三方安装包所在的目录,然后在cron.py硬编码这个目录到系统路径。写法比较dirty,只能作暂时性解决办法。代码如下:

package_dir = ‘/home/dotcloud/env/lib/python2.6/site-packages’
sys.path.append(package_dir)

最后发现另外一种做法,可以设置PYTHON_PATH系统变量的解决方法,未测试

————————————————————————————–
另外使用路径时最后是用__file__取当前(类似PHP的__FILE__常量)作为基准处理其他文件和路径。如:

dir = os.path.dirname(__file__)
settings_dir = os.path.abspath(os.path.join(dir,os.path.pardir))
if settings_dir not in sys.path :
sys.path.append(settings_dir)

————————————————————————————–

最后这是使用每小时整点执行的crontab写法,因为有输出,如果不重定向到null,它会把输出的信息发送到邮件里,这个在调试的时候很有用。

0 * * * * /home/dotcloud/env/bin/python /home/dotcloud/code/hello/weather/cron.py >/dev/null

由此可见,crontab是很笨的,所以处理路径问题时要多加小心。

- EOF -