linux下配置cron定时执行脚本时,脚本第一行必须明确指定解释程序?


单独执行 python2.7 /x/test.py 一切正常


 crontab -l
30 12 * * * python2.7 /x/test.py

cron定时执行脚本时,test.py没有执行
如果在test.py的第一行加上:


 #!/usr/local/bin/python2.7

test.py定时正确执行

为什么出现这种情况?

crontab Linux python

花开院.柚罗 9 years, 8 months ago

或许是cron没有那个 $PATH ,一般cron里的命令都用完整路径。

Astray answered 9 years, 8 months ago

大家都会想到环境变量的问题,可惜没有去读读文档,到底 crontab 有哪些默认的环境变量。
如果题主你已经在 test.py 上加入了 #!/usr/local/bin/python2.7 这一句的话,那么你的 crontab 定时任务定义只需要:


 30 12 * * * /x/test.py

因为脚本第一行指定解释程序后已经是可执行性脚本(文件)了,就不再需要 python2.7 执行命令了。
如果不修改 test.py ,也可以给 python2.7 执行命令 指定路径:


 30 12 * * * /usr/local/bin/python2.7 /x/test.py

但是什么时候需要指定 执行命令 的路径呢?还是读读文档吧。
crontab(5) - Linux man page

Several environment variables are set up automatically by the cron(8) daemon. SHELL is set to /bin/sh, and LOGNAME and HOME are set from the /etc/passwd line of the crontab's owner. HOME and SHELL may be overridden by settings in the crontab; LOGNAME may not.

几个环境变量已经自动设置好了的,如当前的SHELL, SHELL=/bin/bash ,这个crontab所有者的HOME目录是从 /etc/passwd 文件中读取的。除了默认的环境变量外,其他环境变量就需要用户自己设置了,为了找到 python2.7 ,就要设置 PATH=/user/local/bin 了,写法应该是这样的:(没有测试不保证正确)


 30 12 * * * PATH=/usr/local/bin python2.7 /x/test.py

嘻嘻大怪獸 answered 9 years, 8 months ago

检查是否是用 root 权限设置的 crontab
另建议在 crontab 里使用完整路径。

cnmbbdt answered 9 years, 8 months ago

你这错误跟我在 rc.local 里犯的一样:/usr/local/bin 不在 $PATH 里。你写在 shebang 里的是绝对路径,但是 crontab 里没写绝对路径。你去看一下 cron 给你发的报错邮件吧(通常默认在 /var/mail 下)。如果你没有安装某个 sendmail 程序就安装一个,不然两眼摸黑地调试 cron 里的程序很难的。

普隆德拉的微风 answered 9 years, 8 months ago

Your Answer