Bash脚本在终端中手动运行,但不是从crontab

时间:2016-07-16 02:20:18

标签: linux bash shell path cron

我有一个bash脚本,我希望每15分钟执行一次,所以我将此行添加到我的crontab中:

7,22,37,52 * * * * /path/to/my/script.sh

我已经检查了目录路径是否正确,如果我只是从任何目录手动运行/path/to/my/script.sh,脚本就会正常运行。我的剧本中有这个爆炸线:

#!/usr/bin/env bash

我的脚本还引用了与它相同的目录中的其他脚本,并且我已经在所有需要的脚本上运行chmod +x。我将MAILTO设置为我的电子邮件地址,当我将crontab中的行更改为:

时,我收到了一些Cron Daemon电子邮件
7,22,37,52 * * * * sh /path/to/my/script.sh

但我在使用

时从未收到过电子邮件
 7,22,37,52 * * * * /path/to/my/script.sh

7,22,37,52 * * * * bash /path/to/my/script.sh

我确保cron正在运行,并且我也尝试将我的脚本输出重定向到日志文件,这也只有在我包含sh时才会写入。但是,如果我从主目录运行sh /path/to/my/script.sh,它将不起作用。我的脚本实际运行的唯一方法是(从任何目录)我调用/path/to/my/script.shbash /path/to/my/script.sh。我非常擅长编写bash脚本,所以非常欢迎任何帮助。

2 个答案:

答案 0 :(得分:3)

@pvas应特别小心处理cron用户环境。大多数用户的假设是他们可以访问路径,目录,权限等。这远非如此。 Cron在最小的环境中运行,您必须设置一切 - 路径,权限以及运行脚本的位置。

1)我自己设置环境。

2)我在我的crontabs中使用完全扩展的路径。

3)我确保任何需要阅读的目录都具有读权限。

4)我确保我的密码不会过期,因为这样会阻止cron。

5)确保显式调用底层脚本(Perl,Bash,Python等)。

6)将cron行上的命令传递给LOG文件(更好的是带有TIMESTAMP的日志文件)。

修复这些内容,然后重试。 Cron很特别,你需要设置一切。

例如:

#SETUP ENVIRONMENT
SHELL=/bin/bash
source /home/userfoo/.bash_profile

#RUN THE SCRIPT everyday at 11:50pm (23:50)
50   23  *    *   *  userfoo /home/userfoo/script.sh >> LOGFILE.txt

<<

答案 1 :(得分:1)

Crontab条目应具有以下格式

m h  dom mon dow   command

确认您的输入

7,22,37,52 * * * * /path/to/my/script.sh

是对的。话虽如此,您必须关闭crontab编辑器(:wq)才能使更改生效。

建议您浏览[ this ]跨站点帖子,其中描述了cron作业可能存在的问题。

更多关于hashbang [ here ]