我有以下脚本:/var/local/myapp/bin/import
#!/bin/bash
# Move to base directory
cd $(dirname $0)
cd ..
# Execute and bail if one of them fails
cake compile
cake tms:fetch
cake tms:fetch:clean
cake tms:split
cake tms:injest:main
cake tms:injest:schedules
我尝试从 cron 运行它。所有用户都有权访问cake
。但是,当我使用 cron 运行此脚本时,我收到以下错误(在每一行上):
/var/local/myapp/bin/import: line 13: cake: command not found
这是我的 crontab
* * * * * /var/local/myapp/bin/import
另外,我无法找到一种简单的方法,在从 cron 运行时将 bin/import 的标准输出重定向到文件。添加到> /var/local/myapp/import.log
cron 语句的末尾只会截断 import.log - 我能做到的唯一方法是添加exec &> import.log
到 bin/import 本身,这根本不是我想要做的,因为当我手动运行它时,我希望在屏幕上看到输出。
/var/local/myapp/bin/import
当我从终端打字时,一切都运行正常。
答案1
for与用户的PATH
forcron
不同。在脚本中指定 的完整目录cake
,例如:
/path/to/cake compile
如果您现在收到的都是错误消息,那就是输出文件被截断的原因。修复目录问题应该也能解决这个问题。如果您还想记录错误,可以执行以下操作之一:
* * * * * /var/local/myapp/bin/import > /var/local/myapp/import.log 2>&1
或者
* * * * * /var/local/myapp/bin/import > /var/local/myapp/import.log 2> /var/local/myapp/error.log
假设您希望它每分钟运行一次。如果您希望它每小时半小时运行一次,您可以这样做:
30 * * * * /var/local/myapp/bin/import > /var/local/myapp/import.log 2>&1
答案2
正如您所发现的,cron 在受限的环境中运行,包括路径。
在文件顶部设置 PATH,或者(更好)指定完整的 /path/to/cake(和 /path/to/log)。
>> 表示附加到文件。
在您的 crontab 中,您可能应该指定一个或多个时间,而不是使用所有 *。