我有以下shell脚本: /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
此外,我无法找出一个简单的方法来redirectbin /导入的标准输出到从cron运行时的文件。 将> /var/local/myapp/import.log添加到cron语句的末尾只是截断了import.log – 唯一的办法就是将exec &> import.log添加到bin / import本身,这不是'我想做什么,因为当我手工运行它时,我想看到屏幕上的输出。
当我从terminalinput/var/local/myapp/bin/import时,一切正常。
cron的PATH不同于用户的PATH 。 在脚本中指定cake的完整目录,例如:
/path/to/cake compile
如果您现在正在获取的是错误消息,那就是为什么您的输出文件被截断。 解决目录问题也应该能够起作用。 如果您还想logging错误,则可以执行以下操作之一:
* * * * * /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
正如你所发现的,cron运行在一个受限的环境中,包括path。
或者在文件顶部设置PATH,或者(更好地)指定完整的/ path / to / cake(和/ path / to / log)。
>>表示附加到文件。
在你的crontab中,你应该指定一个时间而不是所有的* s。