Bash脚本独立工作,不能在crontab中工作

时间:2015-05-04 22:58:21

标签: linux bash shell cron

我有一个bash脚本设置为从远程驱动器复制备份;如果我从终端运行它,这个脚本工作正常,即$ ./getBackup;但是,如果我尝试将它放在我的crontab中,它就不起作用。

我在这里阅读了一堆问题/答案,包括

也许我错过了一些东西,但我想我已经尝试了那些提供的大部分建议,以及我能想到的其他一切。我试图从我的crontab,sudo crontab,/ etc / crontab运行它;我检查了终端的env(脚本手动工作的地方)并将其放入cron作业的脚本中。

任何人都有任何想法?

[编辑添加] 一些评论者要求提供相关代码,所以:

的crontab:

30 9 * * * /home/opsmonitor/Documents/getBackup

getBackup

cd /home/opsmonitor/Documents/
OF=backup-$(date +%Y%m%d)
echo "Retrieving backup file $OF"
scp root@IP ADDRESS HERE://opt/backups/backupsbydate/$OF.tgz $OF.tgz

正如我所说,getBackup在命令行中工作正常;并从crontab运行,它什么都不做。 (现在我将输出重定向到文件,echo会打印到该文件。)

由于scp从命令行运行,我认为这是一个env问题,但正如我所说的,我在脚本中添加了很多env变量 - 它仍然可以从命令行运行良好并且从的crontab。

1 个答案:

答案 0 :(得分:1)

我通过在修剪额外环境变量的脚本中运行我的程序来测试环境方面。这是一个例子(注意它实际上只留下PATH - 不完全是你想要的):

#!/bin/sh
# $Id: noenv,v 1.3 2014/05/10 22:43:32 tom Exp $
# trim the environment to minimal (PATH may still be long...)
env | sed -e 's/=.*//' -e '/^[  ].*/d' | \
while true
do
    read value
    if test -z "$value" ; then
            # honor assignments to variables in the parameter list
            while test $# != 0
            do
                    case "x$1" in
                    *=*)
                            eval $1
                            name=`echo "$1"|sed -e 's/=.*//'`
                            export $name
                            shift 1
                            ;;
                    *)
                            break
                            ;;
                    esac
            done
            exec "$@"
            break
    fi
    case "$value" in
    HOME|PATH|USER|_|SHLVL|TMPDIR|LOGNAME)
            ;;
    *\ *|*\(*|*\)*|*\!*)
            #echo "...skipping $value"
            ;;
    *)
            #echo value:"$value"
            unset "$value"
            ;;
    esac
done

并且调用noenv,会做

noenv ./getBackup

但是,如果您的程序仍然在命令行中正常工作,我会怀疑它尝试使用/dev/tty等,如果没有找到终端,则会失败。这是cron不太常见的问题,但例如在Linux: Difference between /dev/console , /dev/tty and /dev/tty0中提到。