2

我创建了以下 cronjob 以每 5 分钟运行一次,但由于某种原因它没有。

*/05 * * * * ~/webapps/django/shop/update

当我尝试从 shell 运行脚本时,它运行完美。脚本的内容(尝试运行自定义 django 命令)是

python2.7 manage.py updateTime

关于什么可能是错的任何想法?

谢谢。

编辑:

外壳环境变量:

BASH=/bin/bash
BASH_ARGC=()
BASH_ARGV=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="3" [1]="2" [2]="25" [3]="1" [4]="release" [5]="i686-redhat-linux-gnu")
BASH_VERSION='3.2.25(1)-release'
COLORS=/etc/DIR_COLORS.xterm
COLUMNS=157
CVS_RSH=ssh
DIRSTACK=()
EDITOR=emacs
EUID=629
GROUPS=()
G_BROKEN_FILENAMES=1
HISTFILE=/home/shopperspoll/.bash_history
HISTFILESIZE=1000
HISTSIZE=1000
HISTTIMEFORMAT='%F %T '
HOME=/home/shopperspoll
HOSTNAME=web192.webfaction.com
HOSTTYPE=i686
IFS=$' \t\n'
INPUTRC=/etc/inputrc
LANG=en_US.UTF-8
LESSOPEN='|/usr/bin/lesspipe.sh %s'
LINES=46
LOGNAME=shopperspoll
LS_COLORS='no=00:fi=00:di=00;34:ln=00;36:pi=40;33:so=00;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=00;32:*.cmd=00;32:*.exe=00;32:*.com=00;32:*.btm=00;32:*.bat=00;32:*.sh=00;32:*.csh=00;32:*.tar=00;31:*.tgz=00;31:*.arj=00;31:*.taz=00;31:*.lzh=00;31:*.zip=00;31:*.z=00;31:*.Z=00;31:*.gz=00;31:*.bz2=00;31:*.bz=00;31:*.tz=00;31:*.rpm=00;31:*.cpio=00;31:*.jpg=00;35:*.gif=00;35:*.bmp=00;35:*.xbm=00;35:*.xpm=00;35:*.png=00;35:*.tif=00;35:'
MACHTYPE=i686-redhat-linux-gnu
MAIL=/var/spool/mail/shopperspoll
MAILCHECK=60
OLDPWD=/home/shopperspoll
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
PATH=/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/shopperspoll/bin
PIPESTATUS=([0]="0")
PPID=18520
PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/~}"; echo -ne "\007"'
PS1='[\u@\h \W]\$ '
PS2='> '
PS4='+ '
PWD=/home/shopperspoll
SHELL=/bin/bash
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
SHLVL=1
SSH_CLIENT='99.65.178.55 59982 22'
SSH_CONNECTION='99.65.178.55 59982 174.133.20.142 22'
SSH_TTY=/dev/pts/11
TERM=xterm
UID=629
USER=shopperspoll
_=test
consoletype=pty
tmpid=629

cron 环境变量:

BASH=/bin/sh
BASH_ARGC=()
BASH_ARGV=()
BASH_EXECUTION_STRING='set >/home/shopperspoll/test'
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="3" [1]="2" [2]="25" [3]="1" [4]="release" [5]="i686-redhat-linux-gnu")
BASH_VERSION='3.2.25(1)-release'
DIRSTACK=()
EUID=629
GROUPS=()
HOME=/home/shopperspoll
HOSTNAME=web192.webfaction.com
HOSTTYPE=i686
IFS='
'
LOGNAME=shopperspoll
MACHTYPE=i686-redhat-linux-gnu
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
PATH=/usr/bin:/bin
POSIXLY_CORRECT=y
PPID=24949
PS4='+ '
PWD=/home/shopperspoll
SHELL=/bin/sh
SHELLOPTS=braceexpand:hashall:interactive-comments:posix
SHLVL=1
TERM=dumb
UID=629
USER=shopperspoll
_=/bin/sh
4

3 回答 3

4

首先第一步:将 cron 条目替换为:

*/05 * * * * date >/tmp/qqdate

并通过检查是否已创建/更新来查看它是否实际运行。qqdate

然后,尝试使用update脚本的完整路径名(无~字符) - 波浪号是一种外壳,可能无法被cron.

除此之外,cron它在 shell 中而不是在 shell 中工作的大多数问题cron通常与 cronjobs 获得的大大最小化的环境有关。

在你的 shell 中执行一个set,在 cronjob 中执行一个并找出差异。cronjob 很可能缺少一个重要的环境变量。


我通常做的是获取该 shell 变量文件(来自 a set >shellvarfile),在每一行之前放置一个导出,并. /path/to/shellvarfile从我的 cronjob 脚本中获取它(with )。如果这样可以解决它,那么我知道这是一个环境问题,只需将这些行逐一注释掉,直到它再次中断。您注释掉的最后一个是需要的,因此请取消注释并标记它。然后继续,直到尽可能多的被注释掉。

如果做不到这一点,请尝试找出失败的原因。将 cronjob 更改为:

*/05 * * * * /path/to/webapps/django/shop/update >/tmp/debug 2>&1

然后等待它运行并检查该文件的内容以获取线索。假设 cronjob 正在运行(如您所说),这应该捕获输出并希望指出问题所在。确保发布该文件的内容。

于 2011-05-20T07:59:15.947 回答
2

只是为了加快速度,而不必阅读所有这些评论。我遇到了同样的问题,即 cronjob 没有找到 Python 可执行文件。所以我寻找它:

whereis python2.7

有了这个位置,我编辑了我的 crontab:

crontab -e

最后,我的任务是这样的:

0 */6 * * * /usr/local/bin/python2.7 ~/webapps/proj/app/manage.py poll_twitter

现在就像一个魅力。

于 2013-01-02T21:37:10.150 回答
1

根据您的脚本中的逻辑,您manage.py位于运行 cron 的用户的主目录中。我怀疑这是真的。

像这样调整你的cron任务:

*/05 * * * * python2.7 /absolute/path/to/manage.py updateTime

这应该可以解决问题。

于 2011-05-20T12:39:54.923 回答