1

我有这样的代码:

set -e
set -x
folderName=$(echo `date +%Y/%m/%d/`);
fileName=x.x.x.x.x.x.x.log 
cp x.x.x.x.x.x/$1 $fileName  
gzip $fileName  
s3cmd put $fileName.gz s3://x.x.x.x.x/$folderName    
rm $fileName.gz

如果我这样运行,这工作正常:

./shell logfilelocation

当我像这样添加到 crontab 中时:

* * * * * /home/x.x.x/testing/s3 -f x.x.x.log >> /tmp/mys3Log

我等了!文件mys3Log被创建。但是里面没有内容!我希望命令执行的结果(正如我set -e ; set -x在代码中使用的那样)应该进入mys3Log文件,因为我在那里进行重定向。

但是出了点问题。我对 bash 编程和 cron 非常陌生。

我在哪里犯错误?

提前致谢。

4

2 回答 2

2

cron没有像交互式 shell 一样的环境,所以在脚本的开头,在 shebang 之后,添加:

source ~/.bashrc || source /etc/profile

并删除set -e以查看发生了什么。

在您的crontab, 中记录错误和输出 ( STDERR, STDOUT),您需要执行以下操作:

* * * * * /home/x.x.x/testing/s3 -f x.x.x.log >> /tmp/mys3Log 2>&1

此外,在脚本的第 4 行,您使用的$name是从未声明过的变量。

最后但同样重要的是,就像 Janauary 说的,#!/bin/bash在第一行添加 shegang 并确保您的脚本具有可执行权限。:chmod +x script.sh

于 2012-10-12T11:26:34.457 回答
0

如上一个答案中所述,cron 在与您的 shell 不同的环境中工作。这意味着环境变量在 shell 中会有所不同。例如:

在外壳中:

$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/aws/bin

而如果您在 cron 中运行以下命令:

* * * * * echo $PATH > path.out

你会得到/usr/bin:/bin

使用该命令找出您的 s3cmd 可执行文件在哪里which s3cmd,然后相应地修改 cron。例如:

$ which s3cmd
/usr/local/bin/s3cmd

然后,cron 应该如下所示:

PATH=/usr/bin:/bin:/usr/local/bin
* * * * * echo $PATH > path.out
于 2015-11-30T21:27:28.687 回答