使用 cron 运行一个 bash 脚本,该脚本运行一堆子命令

使用 cron 运行一个 bash 脚本,该脚本运行一堆子命令

我有以下脚本:/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.logcron 语句的末尾只会截断 import.log - 我能做到的唯一方法是添加exec &> import.log到 bin/import 本身,这根本不是我想要做的,因为当我手动运行它时,我希望在屏幕上看到输出。

/var/local/myapp/bin/import当我从终端打字时,一切都运行正常。

答案1

for与用户的PATHforcron不同。在脚本中指定 的完整目录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 中,您可能应该指定一个或多个时间,而不是使用所有 *。

相关内容