我有一个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。
答案 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中提到。