【问题标题】:Debugging my cron application调试我的 cron 应用程序
【发布时间】:2012-10-12 11:18:11
【问题描述】:

我有这样的代码:

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 非常陌生。

我在哪里犯了错误?

提前致谢。

【问题讨论】:

    标签: bash shell ubuntu amazon-s3 s3cmd


    【解决方案1】:

    cron 和交互式 shell 的环境不同,所以在脚本的开头,shebang 之后,添加:

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

    然后删除set -e 看看发生了什么。

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

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

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

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

    【讨论】:

    • 应该将source ~/.bashrc || source /etc/profile这一行添加到cron文件中?
    • 感谢您的回答,您没有回答我的评论问题。
    • 我的 cron 日志文件中出现 s3cmd: command not found 错误。
    • 是的,它可以在交互式 shell 和我的 shell 脚本中运行。仅在 crontab 中失败。
    • 所以在你的脚本中,把s3cmd的完整路径放在
    【解决方案2】:

    如上一个答案中所述,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

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

    $ which s3cmd
    /usr/local/bin/s3cmd
    

    那么,cron 应该是这样的:

    PATH=/usr/bin:/bin:/usr/local/bin
    * * * * * echo $PATH > path.out
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多